今日数据结构课讲到栈,突然提到这道陈年老题用栈去实现,遂脑洞凿开自己写了一遍.
顺便用了vector模拟栈,是平时没怎么用过的类型所以改了老半天的bug还做了半天的笔记.
然后看了一眼原题是有括号的,寄!
#include<bits/stdc++.h>
using namespace std;
typedef vector<char> vc;
typedef vector<int> vi;
vc num;//存放数字,即用即清
vc s;//存放运算符
vi n;//存放所有的数字
string str;//存放输入
void push_num()//把数转换格式后压栈
{
if(num.empty()) return;
int a=0;
for(int j=0;!num.empty();j++)
{
a+=pow(10,j)*(num.back()-'0');
num.pop_back();
}
n.push_back(a);
num.clear();
}
void chengchu()//乘除
{
if(s.back()=='*')
{
n[n.size()-2]=n[n.size()-2]*n[n.size()-1];
n.pop_back();
}
else
{
n[n.size()-2]=n[n.size()-2]/n[n.size()-1];
n.pop_back();
}
s.pop_back();
}
int main()
{
cin>>str;
for(int i=0;i<str.size();i++)
{
if(str[i]>='0'&&str[i]<='9')//是数字
num.push_back(str[i]);//压栈
else
{
//首先处理数字
push_num();
if(!s.empty())//进行操作前一定要判断非空!!
if(s.back()=='*'||s.back()=='/')//优先处理乘除
chengchu();
s.push_back(str[i]);
}
}
//处理最后的数字和乘除
push_num();
if(!s.empty())//判断非空!!
if(s.back()=='*'||s.back()=='/')//处理可能剩余的乘除
chengchu();
if(!s.empty())//还是要判断非空!!
for(int i=0;i<s.size();i++)//集中处理加减
{
if(s[i]=='+')
n[i+1]+=n[i];
else
n[i+1]=n[i]-n[i+1];
}
cout<<n.back();
return 0;
}