逆波兰式(字符栈)
转自
https://www.cnblogs.com/unixfy/p/3344550.html
栈高栈出
栈小外进
同号栈高
左括必进遇右出
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int i;
char str[2000];
char seqstack[2000];
seqstack[0]='#';//用这个做首元素可做pop终止的操作。
int top=0;
scanf("%s",str);
int len=strlen(str);
for(i=0;i<len;i++)
{
//因为只有括号与加减乘除符号,符号不多,直接if讨论处理就好了。
if(str[i]=='(') //先考虑左右括号的情形
{
seqstack[++top]='('; //左括号直接入栈
}
else if(str[i]==')')
{
while(seqstack[top]!='(') //右括号就找第一个左括号,并将到左括号为止的所有元素pop,(包括左括号)
{
printf("%c",seqstack[top]);
seqstack[top]=0; //pop操作
top--;
}
seqstack[top]=0; //这步是除'('
top--;
} //因为将括号额外考虑,所以,*,/优先级最高,直接入栈
else if(str[i]=='*'||str[i]=='/') //若c1<c2,则c2进栈继续扫描后面表达式;c1是指存运算符的栈,c2是指输入的字符串
{
while(seqstack[top]=='*'||seqstack[top]=='/')//c2与c1比较都是用while的
{ //*,/比*,/优先级低。
printf("%c",seqstack[top]);
seqstack[top]=0;
top--;
}
//若c1=c2,则(“=”),即括号内运算结束,将c1出栈,并且c2放弃,继续扫描后面表达式;
seqstack[++top]=str[i]; //若c1>c2,则将c1出栈,并在操作数栈取出两个元素a和b按c1做运算,运算结果进OPND.
} //重复直到表达式求值完毕。
else if(str[i]=='+'||str[i]=='-') //c1,c2符号相同的情况下,c1>c2,即栈的优先级更高。
{
while(seqstack[top]=='*'||seqstack[top]=='/'||seqstack[top]=='+'||seqstack[top]=='-')//c2与c1比较都是用while的
{ //+,-比*,/,+,-优先级低。
printf("%c",seqstack[top]);
seqstack[top]=0; //pop操作
top--;
}
seqstack[++top]=str[i]; //push操作
}
else //除了左括号外,运算符都要判断栈首是否为空,但本题不需要,因为栈不存数字,只是存表达式
printf("%c",str[i]);
}
while(top!=0)
{
printf("%c",seqstack[top]);
seqstack[top]=0; //pop操作
top--;
}
printf("\n");
return 0;
}