常规数学表达式的前缀表达式称为波兰表示式,后缀表达式又称逆波兰表达式。对于逆波兰表达式的求解可借助于栈,把数字全部压入栈中,遇到计算符号再弹出两个数,计算结果压入栈中,重复这个过程,最后的数字就是计算结果。
例子: 3-(4+8/2)*3=-21 48/3+12-6*2+7=23
输入文件内容:
3 4 8 2 / + 3 * - EOF
48 3 / 12 + 6 2 * - 7 + EOF
#include <iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
bool judge(int x){
if(x=='+'||x=='-'||x=='*'||x=='/')return true;
return false;
}
int solve(){
int stack[101],top=0;
char a[20]; //'+'-->43 '-'-->45 '*'-->42 '/'-->47 ' '-->32 '0'-->48 '\n'-->10
while(~scanf("%s",&a)){
if(a[0]==' ')continue;
if(a[0]=='E')break;
int b=atoi(a);
if(judge(a[0])){
int q2=stack[top--],q1=stack[top--],q3;
if(a[0]=='+')q3=q1+q2;
else if(a[0]=='-')q3=q1-q2;
else if(a[0]=='*')q3=q1*q2;
else q3=q1/q2;
stack[++top]=q3;
}
else stack[++top]=b;
//for(int i=1;i<=top;i++)cout<<stack[i]<<' '; cout<<endl;
}
return stack[1];
}
int main(int argc, char *argv[]){
freopen("cin.txt","r",stdin);
printf("%d\n",solve());
printf("%d\n",solve());
return 0;
}
回文数字:反着念和正着念的结果一样。这又和栈联系到了一起。把数字存储到栈中,如果新的数字和栈顶数字一样或新的数字和栈顶数字的“顶下"数字一样,那么涉及的数字都弹出,若栈中没有了数字则是一个回文数,否则不是。
回文数字的判断:
int stack[151],top=0;
bool judge(){
top=0;
int a;
while(cin>>a){
if(a==-1)break;
if(top>0&&a==stack[top])top--;
else if(top>1&&a==stack[top-1]){
top=top-2;
}
else stack[++top]=a;
}
if(top==0)return true;
else return false;
}