栈的应用——后缀表达式的转化以及计算

栈的应用——后缀表达式的转化以及计算

后缀表达式的转化

将算术表达式存放在一个字符串中,之后从字符串的第一个字符开始读取。

  1. 若是数字,则直接进行输出;
  2. 若是左括号,则将其压入栈中;
  3. 若是右括号,则进行弹出并输出,直至找到左括号,左括号弹出但不进行输出,若无法找到左括号则证明有错误,输出wrong并停止执行程序;
  4. 若是操作符号,则与栈顶所存放的符号比较优先级,若栈为空或优先于栈顶存放的符号,则压入栈中,否则进行弹出操作直至栈为空或者不再优先于栈顶存放的符号时停止,并将该符号压入栈中。在最后将栈中存放的标点符号全部弹出并输出。:
//规定优先级
int priority(char c){//判断优先级 
	if(c=='+' or c=='-') return 2;
	else if(c=='*' or c=='/') return 3;
	else if(c=='(') return 1;
}

//转化为后缀表达式

stringstream ss;
	for (int i=0;i<a.size();i++){
		if(a[i]==' '){
			continue;
		}
		if(isdigit(a[i])){//数字直接输出 
			ss<<a[i]<<" ";
		}
		else{
			int score=priority(a[i]);
			if(a[i]=='('){
				s1.push(a[i]); 
			}
			else if(a[i]==')'){
				while(s1.topValue()!='(' && s1.topValue()!=0){
					ss<<s1.topValue()<<" ";
					s1.pop();
				}
				if(s1.topValue() =='(') s1.pop() ;
				else if(s1.topValue() == 0){
					ss<<"wrong"<<endl;
					return 0;
				}
			}
			else if(s1.topValue()==0 || score>priority(s1.topValue())) s1.push(a[i]);
			else {
				while(s1.topValue()!=0 or score<=priority(s1.topValue() )){
					ss<<s1.pop()<<" " ;
				}
				s1.push(a[i]);
			}

		}
	}
		while(s1.topValue() !=0){
			ss<<s1.pop()<<" ";
		}
	cout<<ss.str()<<endl;

后缀表达式的计算

同样,从字符串的第一个字符开始进行处理,

  1. 若为空格,则进行判断,若是数字,即is0函数为真或者n不为0则将这个数字压入栈中并跳过此次循环;
  2. 若是数字,则将其放到n中,并且将is0置为真;
  3. 若是标点符号,则弹出两个数字并进行相应操作,并将结果压入栈中

最后栈中只剩下一个数字,即为结果,若小于或大于一个数字均为错误,进行输出。若是数字,则将其放到n中,并且将is0置为真;

int sum(string exp){
	AStack<int> num;
	int n=0,t1,t2;
	bool is0=false;
	for(int i=0;i<exp.size();i++){
		if(exp[i]==' '){
			if(n!=0||is0){
				num.push(n);
				n=0; 
				is0=false;
			}
		continue;
		}
		if(isdigit(exp[i])){
			n*=10;
			n+=(exp[i]-'0');
			is0=true;
		}
		else{
			if(num.length()<2){
				cout<<"wrong"<<endl;
				return 0;
			}
			t1=num.pop() ;
			t2=num.pop() ;
			if(exp[i]=='+'){
				t2+=t1;
			}
			else if(exp[i]=='-'){
				t2-=t1;
			}
			else if(exp[i]=='*'){
				t2*=t1;
			}
			else if(exp[i]=='/'){
				t2/=t1;
			}
			num.push(t2); 
		}
	}
	if(num.length()!=1 )cout<<"wrong"<<endl;
	return num.topValue() ;
}

测试

测试1测试2

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值