/*
Name:infixSuffixConv.c
Copyright: personal
Author: hojor
Date: 10-06-10 21:24
Description: infix convert to suffix
*/
#include<stdio.h>
#include<stdlib.h>
#define STACK_SIZE 20
////~stack start
//stack struct
typedef struct stack{
int top;
int a[STACK_SIZE];
}stack;
//create stack
stack * createStack()
{
stack * s = (stack *)malloc(sizeof(stack));
s->top = -1;
return s;
}
//get the the top value of stack
int getTop(stack * s)
{
return s->a[s->top];
}
//is stack empty?
int isEmpty(stack * s)
{
return s->top == -1;
}
//is stack full?
int isFull(stack * s)
{
return s->top == (STACK_SIZE-1);
}
//pop stack return value
int pop(stack * s)
{
if(!isEmpty(s))
{
return s->a[s->top--];
}
else
{
printf("stack empty!!\n");
return 0;
}
}
//push value x to stack
void push(stack * s,int x)
{
if(!isFull(s))
{
s->a[++s->top] = x;
}
else
{
printf("stack is full!!\n");
}
}
////~
////~infix suffix convert start
//get the level of symbol
int getLevel(char symbol)
{
switch(symbol)
{
case '(':
return 10;
break;
case '*':
case '/':
return 9;
break;
case '+':
case '-':
return 8;
break;
default:
printf("symbol error!!:[%c]\n",symbol);
}
}
//is char symbol??
int isSymbol(char ch)
{
return (ch == '(')||(ch == '*')||(ch == '/') \
||(ch == '-')||(ch == '+')||(ch == ')');
}
//function of convert infix to suffix
void infix_suffix_convert(char * infixStr,char * suffixStr)
{
stack * symStack = createStack();
int iCount = strlen(infixStr),i,flag,j,k,n;
i=j=k=flag=n=0;
for(i=0;i<=iCount;i++)
{
//表达式中读到字符为运算符
if(isSymbol(infixStr[i]))
{
/*符号入栈条件,如果当前读取的符号不是闭合括号,并且栈为空或栈顶
为开括号或栈顶的符号优先级小于当前读取符号则符号入栈*/
if(( isEmpty(symStack) && \
infixStr[i] != ')' )
|| ( (char)getTop(symStack)=='(' && \
infixStr[i] != ')' )
|| ( infixStr[i]!=')' && \
getLevel((char)getTop(symStack)) < getLevel(infixStr[i]) ))
{
push(symStack,infixStr[i]);
}
else if(infixStr[i] == ')')
{/*如果遇到闭合括号,符号出栈,输出,直到开括号出栈为止*/
while((char)getTop(symStack)!='(')
{
sprintf(suffixStr,"%s %c",suffixStr,pop(symStack));
}
pop(symStack);
}
else
{/*如果栈为非空并且栈顶符号优先级大于当前读取的符号则出栈,
输出,直到栈顶符号的优先级小于当前读取的符号为止*/
while(!isEmpty(symStack) &&
(getLevel((char)getTop(symStack)) \
>= getLevel(infixStr[i])) )
{
sprintf(suffixStr,"%s %c",suffixStr,pop(symStack));
}
push(symStack,infixStr[i]);
}
flag=2;
}
else if(infixStr[i]>='0' && infixStr[i]<='9')
{//表达式中读取的字符为数字,输出
if(flag == 2 || flag == 0)
{
sprintf(suffixStr,"%s %d",suffixStr,atoi(&infixStr[i]));
flag = 3;
}
}
else
{
;
}
}
//因数字已经全部输出,故栈内所有符号出栈,输出
while(!isEmpty(symStack))
sprintf(suffixStr,"%s %c",suffixStr,pop(symStack));
}
////~
int main()
{
///---stack test
printf("\n********** stack test ***********\n");
int i,j=0,k=0;
stack * s = createStack();
for(i=0;i<10;i++)
push(s,i);
for(i=0;i<10;i++)
printf("%d ",pop(s));
putchar('\n');
free(s);
///---convert start
printf("\n********* convert start **********\n");
int a = 50;
char * infix="( 177 + 25 ) * 555 + (35 + 655 )";
printf("\n中缀表达式:\n%s\n",infix);
char suffix[100];
memset(suffix,0,sizeof(suffix));
infix_suffix_convert(infix,suffix);
printf("\n后缀表达式:\n%s\n\n",suffix);
system("pause");
return 0;
}
分享到:
相关推荐
利用C语言实现中缀表达式转化为后缀表达式!!利用栈。
c语言实现中缀表达式转后缀表达式并求得计算结果,用顺序栈结构。 当输入者输入错误信息的时候需要报错,并说明错误的种类。
在计算机科学中,数据...总结来说,中缀表达式转后缀表达式是数据结构和算法中的一个经典问题,主要利用堆栈数据结构和运算符优先级规则。在C++中实现这一转换,可以提高计算效率,便于计算机解析和执行数学表达式。
一个简单的算法,利用栈实现中缀表达式与后缀表达式的转换
4. 中缀转后缀:使用栈来实现中缀表达式到后缀表达式的转换。 5. 表达式求值:根据后缀表达式,使用栈进行计算。 6. 输出结果:显示转换后的后缀表达式和计算后的值。 具体实现细节如下: 1. 定义结构体 `struct ...
编译系统对中缀表达式的处理方法是先把它转换为后后缀表达式.在后缀表达式中,运算符位于两个操作数的后面,并且没有括号,其运算符的次序就是其执行运算的次序。后缀表达式计算过程的规则非常简单:从左到右依次扫描,...
在C语言中,我们可以使用数组或动态分配的内存来实现栈。定义一个栈结构体,包括栈顶指针和存储运算符的数组。 2. **扫描表达式**:从左到右逐个读取中缀表达式的字符。遇到数字时,直接将其添加到后缀表达式;遇到...
用栈实现中缀表达式转为后缀表达式,规定了各个符号的优先级,可以说是对栈概念的深入理解
### C语言实现中缀表达式向后缀表达式转换 #### 概述 在计算机科学领域,表达式的处理是一项基础而重要的任务。表达式通常有三种形式:前缀(波兰)、中缀(标准数学表达式)和后缀(逆波兰)。本篇文章将详细探讨...
/*程序由本人编译,并且经过多次测试,正确无误!目前该转换算法只支持数字在0至9之间的+-*/四元运算转换.*/ /**************程序员信息 ***************东北大学*******************东大很厉害**************** ...
### 自定义栈中缀表达式转换为后缀表达式并求值 #### 需求分析与背景 在计算机科学领域,将一个中缀表达式转换为后缀表达式是解决算术表达式求值问题的一种常用方法。通过这种方式可以避免括号带来的优先级问题,...
c++使用堆栈实现中缀表达式转后缀表达式
中缀表达式转后缀表达式的算法通常涉及两个主要步骤:构建二叉表达式树(也称运算符优先树)和遍历该树以生成后缀表达式。下面将详细介绍这两个步骤以及C++代码实现的关键点。 1. **构建二叉表达式树**: - 二叉...
总结来说,中缀表达式转后缀表达式是通过解析运算符优先级和括号来完成的,这在编译器设计和算法实现中是基础且重要的一步。后缀表达式及其对应的表达式树简化了表达式的解析和计算,使计算机能更高效地处理数学...
总结来说,中缀表达式转后缀表达式是编译原理中的基本操作,它涉及到了栈数据结构、运算符优先级以及表达式树的构建。通过这种方法,我们可以更高效地计算和解析数学表达式,这对于计算机程序设计,尤其是编译器和...
中缀表达式转换为后缀表达式_C++程序设计 中缀表达式转换为后缀表达式是一个常见的数据结构和算法问题。中缀表达式是一种常见的数学表达式表示形式,例如:a \* (x + y) / (b - x),而后缀表达式是将运算符移到它的...
用户输入中缀表达式,程序输出后缀表达式并输出计算结果