求解逆波兰表达式的值,回文数字的判断&&栈的应用

来源:互联网 发布:网络优化工程师 西安 编辑:程序博客网 时间:2024/06/11 04:58

常规数学表达式的前缀表达式称为波兰表示式,后缀表达式又称逆波兰表达式。对于逆波兰表达式的求解可借助于栈,把数字全部压入栈中,遇到计算符号再弹出两个数,计算结果压入栈中,重复这个过程,最后的数字就是计算结果。

例子: 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;}


0 0
原创粉丝点击