栈表达式

栈表达式

栈的用处就是用来求前缀,中缀,后缀的表达式三种方法
中缀,就是符号在中间的算式
前缀,就是符号在前面的算式
后缀,就是符号在后面的算式

一:后缀表达式进行求值
1.首先我们建立一个栈,用来存数,注意进行扫描表达式中的元素。
2.如果遇到一个数,就把他入栈。
3.如果遇到符号,就取出栈顶两个元素,求值然后入栈。(符号要进行枚举,枚举±*/)
4.直至最后当栈里只剩下一个元素,就是这个表达式的值
我们再来了解一个函数,叫做stoi,是一个字符串转整形的函数,但是不能随便用

二:中缀转后缀
1.建立一个用于存运算符号的栈,逐个进行扫描中缀表达式的元素
2.如果遇见数就输出
3.如果遇到左括号就入栈
4.如果遇到右括号,就说明结束了,不断的取出栈顶直至遇见左括号,然后出栈
5.如果遇到运算符,只要栈顶的符号的优先级大于新的,也就是碰见优先级小的就出栈,不然就一直积累。就不断的取栈顶输出,最后把新的进栈。
6.这样的话输出的就是一个后缀表达式

三:中缀表达式的递归求值
大目标:求解1~n的值
子问题:l~r的值
1.如果l~r之间没有被括号包含的运算符
如果存在加减号,就分成左右两半进行递归,结果相加减
如果存在乘除,就分成左右两半进行递归,结果相乘除

2.不存在运算符:
结尾是括号就递归l+1~r-1
不然就是l~r就是一个数直接返回

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<stack>
#include<cstdio>
using namespace std;
string s;//输入的后缀表达式 
int main()
{
	getline(cin,s);
	stack<int> feynman;
	int l=0,r=0;
	for(int i=0;i<s.size();i++)
	{
		if(s[i]>='0'&&s[i]<='9')
		{
			string s2;
			while(s[i]>='0'&&s[i]<='9')
			{
				s2+=s[i];//取出这个数
				//字符串拼接
				i++; 
			}
			int shabi=stoi(s2);
			feynman.push(shabi);//数字进栈 
		}
		else if(s[i]!=' ')
		{
			if(!feynman.empty())
			{
				r=feynman.top();
				feynman.pop();
			}
			if(!feynman.empty())
			{
				l=feynman.top();
				feynman.pop();//取栈顶两个元素 
			}
			switch(s[i])
			{
				case'+': feynman.push(l+r);break;
				case'-': feynman.push(l-r);break;
				case'*': feynman.push(l*r);break;
				case'/': feynman.push(l/r);break;
				default: break; 
			}//枚举符号 
		}
	} 
	cout<<feynman.top()<<endl;
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值