学完数据结构的 栈 后自己的写法
例如
(1+1)*(2+2)
结果
8
//用两个堆栈实现 x用来存数字,y 用来存运算符
//至少实现两种运算操作 1:数字的运算,2:运算符的比较
//在运算过程中是那边运算边存储在四则运算中数字栈中会保持在三个是以内
//数字运算时 字符转化成数字,
//运算符比较需要定义优先级 (等级差值法)
#include<iostream>
#include<stack>
using namespace std;
stack<int> x;
stack<char> y;
//数字运算
void sys()
{ //a是后面的元素,c是栈顶元素
char b;
b=y.top();
y.pop();
int a,c;
c=x.top();
x.pop();
a=x.top();
x.pop();
int zhi;
if(b=='+')
{
zhi=a+c;
x.push(zhi);
}
if(b=='-')
{
zhi=a-c;
x.push(zhi);
}
if(b=='*')
{
zhi=a*c;
x.push(zhi);
}
if(b=='/')
{
zhi=a/c;
x.push(zhi);
}
}
//在+-*/中 只会有 * / 和 - +的比较
//先搞一个字符数组 z[]预定义一下 当差值 >=2 时为不同等级
char z[]={'(',')','!','+','-','!','*','/','\0'};
//运算符栈的比较 当前元素 m 和栈顶 n 比较
int bij(char m,char n)
{
int i=0,j=0;
while(m!=z[i])
{
i++;
}
while(n!=z[j])
{
j++;
}
return i-j;
}
//一个递归解决 () 里有好几个运算
void kuohao()
{
if(y.top()=='(') //这是防止太坑 比如 3+(1)-2 这种
y.pop();
else
{
sys();
if(y.top() =='(')
y.pop();
else
kuohao();
}
}
int main()
{
string s;
cin >>s;
int i;
for(i=0;i<s.size();) // 对于运算式的扫描
{ //这里的i 的移动是在每一步操作里的 方便操作
if(s[i]-'0'>=0&&s[i]-'0'<=9)
{ //数字的存储
int res=0;
while(s[i]-'0'>=0&&s[i]-'0'<=9)
{
int z=s[i]-'0';
res=res*10 + z;
i++;
}
x.push(res);
}
else
{ //运算符和()之间分别判断 之后还可以有其他运算如 平方等
if(s[i]=='/'||s[i]=='*'||s[i]=='+'||s[i]=='-')
{
//在进入运算符栈的时候应该先判断优先级
if(y.empty()) y.push(s[i]),i++;
else
{
if(bij(s[i],y.top())>=2)//优先级高的进栈
{
y.push(s[i]);
i++;
}
else
{
//cout<<bij(s[i],y.top());
sys();
y.push(s[i]);
i++;
}
//y.push(s[i]);
}
}
if(s[i]=='(')
y.push(s[i]),i++;
if(s[i]==')') //进行括号里的所有运算
kuohao(),i++;
}
}
//这是用于3+2*4 这种的
while(!y.empty())
sys();
cout <<x.top();
return 0;
}
这里的 测试样例还不够
如有问题请多多指点;