后缀表达式的计算方式

本后缀表达式只能计算小于10的计算,同事不能包含负数

关键知识点:

1、后缀表达式使用的是字符串
2、借助的工具是栈stack
3、计算规则:数字村栈,符号从栈取两数,后数在前。
编辑器:Devc++
代码如下:

#include<iostream>
#include<stack>
using namespace std;
//后缀表达式计算结果  分为两类 
double com(double m,char b,double n)
{
	switch(b)
	{
		case '+':
			return m+n;
		case '-':
			return n-m;
		case '*':
			return n*m;
		case '/':
			return n/m;
	} 
}
double get_suf_value(string str)
{
	//从容器中取出来的数字保存,第一种方法,容器 
	//vector<char> v;
	stack<double> st;
	//遍历每一个元素
	for(int i=0;i<str.length();i++)
	{
		char tmp;
		double m=0.0, n=0.0,k=0.0;//m,n为保存两个数,计算,m为之前的数字大小 
		tmp=str[i];
		cout<<"第"<<i+1<<"个字符为"<<tmp<<endl;
		switch(tmp)
		{
			case '+':
			case '-':
			case '*':
			case '/':
				cout<<"栈的大小为"<<st.size()<<endl;
				n=st.top();
				cout<<"栈中元素为:"<<n<<endl;
				st.pop(); //每次取数减少1
				m=st.top();
				st.pop(); 
				cout<<"栈中元素为:"<<m<<endl;
				k=com(n,str[i],m);
				cout<<"输出新的计算结果"<<k<<",然后入栈"<<endl;
				st.push(k); 
				break;
				
			default:
				if(str[i]>='0'&&str[i]<='9')
					{
						cout<<"default数字"<<str[i]-'0'<<"入栈"<<endl;
						st.push(str[i]-'0');
					}
				break;
		
		}
	} 
	double m=0.0;
	m=st.top();
	st.pop();
	cout<<"栈的大小为"<<st.size()<<endl;
	return m;
} 
int main()
{
	cout<<"输入后缀表达式"<<endl;
	string s;
	getline(cin,s);
	
	double t=get_suf_value(s);
	cout<<"算式结果为:"<<endl;
//	cout<<"测试的记过为"<<com(15,'*',30)<<endl;
	cout<<t<<endl; 
	return 0;
} 

比较推荐这种写法,至于多位数,代码写完之后再补充.
下面是不用函数,写在每一个±*/当中那个的

#include<iostream>
#include<vector>
#include<stack>
using namespace std;
//后缀表达式计算结果  分为两类 
double com(double m,char b,double n)
{
	switch(b)
	{
		case '+':
			return m+n;
		case '-':
			return n-m;
		case '*':
			return n*m;
		case '/':
			return n/m;
	} 
}
double get_suf_value(string str)
{
	//从容器中取出来的数字保存,第一种方法,容器 
	//vector<char> v;
	stack<double> st;
	//遍历每一个元素
	for(int i=0;i<str.length();i++)
	{
		char tmp;
		double m=0.0, n=0.0,k=0.0;//m,n为保存两个数,计算,m为之前的数字大小 
		tmp=str[i];
		cout<<"第"<<i+1<<"个字符为"<<tmp<<endl;
		switch(tmp)
		{
			case '+':
			case '-':
			case '*':
			case '/':
				cout<<"栈的大小为"<<st.size()<<endl;
				n=st.top();
				cout<<"栈中元素为:"<<n<<endl;
				st.pop(); 
				m=st.top();
				st.pop(); 
				cout<<"栈中元素为:"<<m<<endl;
				k=com(n,str[i],m);
				cout<<"输出新的计算结果"<<k<<",然后入栈"<<endl;
				st.push(k); 
				break;
				
			default:
				if(str[i]>='0'&&str[i]<='9')
					{
						cout<<"default数字"<<str[i]-'0'<<"入栈"<<endl;
						st.push(str[i]-'0');
					}
				break;
			/*
			//计算出结果之后重新入栈 
			case '+':
				
				cout<<"之间计算的结果出栈"<<endl;
				cout<<"栈的大小为"<<st.size()<<endl;
				n=st.top();
				cout<<"栈中元素为:"<<n<<endl;
				st.pop(); 
				m=st.top();
				st.pop(); 
				cout<<"栈中元素为:"<<m<<endl;
			
				k=m+n;//后出栈的减去先出栈的 
				cout<<"输出新的计算结果"<<k<<",然后入栈"<<endl;
				st.push(k); 
				break;
				
			case '-':
				cout<<"之间计算的结果出栈"<<endl;
				n=st.top();
				st.pop(); 
				m=st.top();
				st.pop(); 
				cout<<"输出新的计算结果"<<k<<",然后入栈"<<endl;
				k=m-n;//后出栈的减去先出栈的 
				st.push(k); 
				break;
			case '*':
				cout<<"之间计算的结果出栈"<<endl;
				cout<<"栈的大小为"<<st.size()<<endl;
				n=st.top();
				cout<<"栈中元素为:"<<n<<endl;
				st.pop(); 
				m=st.top();
				st.pop(); 
				cout<<"栈中元素为:"<<m<<endl;
			
				k=m*n;//后出栈的减去先出栈的 
				cout<<"输出新的计算结果"<<k<<",然后入栈"<<endl;
				st.push(k); 
				break;
			case '/': 
				cout<<"之间计算的结果出栈"<<endl;
				n=st.top();
				st.pop(); 
				m=st.top();
				st.pop(); 
				cout<<"输出新的计算结果"<<k<<",然后入栈"<<endl;
				k=m/n;//后出栈的减去先出栈的 
				st.push(k); 
				break;
			default:
				if(str[i]>='0'&&str[i]<='9')
					{
						cout<<"default数字"<<str[i]-'0'<<"入栈"<<endl;
						st.push(str[i]-'0');
					}
				break; 
			*/
		}
	} 
	double m=0.0;
	m=st.top();
	st.pop();
	cout<<"栈的大小为"<<st.size()<<endl;
	return m;
} 
int main()
{
	cout<<"输入后缀表达式"<<endl;
	string s;
	getline(cin,s);
	
	double t=get_suf_value(s);
	cout<<"算式结果为:"<<endl;
//	cout<<"测试的记过为"<<com(15,'*',30)<<endl;
	cout<<t<<endl; 
	return 0;
} 

就是我注释的部分,代码编写测试均没有问题

在这里插入图片描述
图太长,接下:
在这里插入图片描述

切记,不要使用多位数,如果后续可以写出多位数,再来补充。

发布了10 篇原创文章 · 获赞 3 · 访问量 3912

猜你喜欢

转载自blog.csdn.net/QT_continue/article/details/100813293