规则:
转换过程需要用到栈,具体过程如下:
1)如果遇到操作数,我们就直接将其输出。
2)如果遇到操作符,则我们将其放入到栈中,遇到左括号时我们也将其放入栈中。
3)如果遇到一个右括号,则将栈元素弹出,将弹出的操作符输出直到遇到左括号为止。注意,左括号只弹出并不输出。
4)如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) "的情况下我们才弹出" ( ",其他情况我们都不会弹出" ( "。
5)如果我们读到了输入的末尾,则将栈中所有元素依次弹出。
#include<iostream>
#include "stdlib.h"
#include<cmath>
using namespace std;
#define STACK_SIZE 100
#define STACKINCREMENT 10
#define MAXBUFFER 10//输入单个数长度最大值
typedef char ElemType;
struct sqStack
{
ElemType *top;
ElemType *base;
int stackSize;
};
void InitStack(sqStack *s)
{
s->base=(ElemType*)malloc(sizeof(ElemType)*STACK_SIZE);
if(!s->base)
exit(0);
s->top=s->base;
s->stackSize=STACK_SIZE;
}
void Push(sqStack *s,ElemType e)
{
if(s->top-s->base>=s->stackSize)
{
s->base=(ElemType*)realloc(s->base,(s->stackSize+STACKINCREMENT)*sizeof(ElemType));
if(!s->base)
exit(0);
s->top=s->base+s->stackSize;
s->stackSize=s->stackSize+STACKINCREMENT;
}
*(s->top)=e;
s->top++;
}
void Pop(sqStack *s,ElemType *e)
{
if(s->top==s->base)
return;
s->top--;
*e=*(s->top);
}
//计算栈的当前容量
int Stacklen(sqStack *s)
{
return (s->top-s->base);
}
int main()
{
sqStack s;
char c,e;
InitStack(&s);
printf("请输入中缀表达式,以#表示结束:");
scanf("%c",&c);
while(c!='#')
{
while(c>='0'&&c<='9')//判断是数字的话,输出,且进一步判断是否为连续数字,比如10,此时不打空格
{
printf("%c",c);
scanf("%c",&c);
if(c<'0'||c>'9')
{
printf(" ");//跳出循环后,判断c是否为'#'。
}
}
if(c==')')
{
Pop(&s,&e);
while(e!='(')
{
printf("%c ",e);
Pop(&s,&e);
}
}
else if(c=='+'||c=='-')//把之前进栈的运算符弹出(在'('内)
{
if(!Stacklen(&s))
Push(&s,c);
else
{
do
{
Pop(&s,&e);
if(e=='(')
Push(&s,e);
else
printf("%c ",e);
}while(Stacklen(&s)&&e!='(');
Push(&s,c);
}
}
else if(c=='*'||c=='/'||c=='(')
Push(&s,c);
else if(c=='#')
break;
else
{
printf("输入错误!");
return -1;
}
scanf("%c",&c);
}
while(Stacklen(&s))
{
Pop(&s,&e);
printf("%c ",e);
}
return 0;
}
运行: