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

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

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


你可能感兴趣的:(算法)