本后缀表达式只能计算小于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;
}
就是我注释的部分,代码编写测试均没有问题
:
图太长,接下: