<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255);"></span><pre name="code" class="cpp"><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">题目要求:</span>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255);"></span><pre name="code" class="cpp"><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">题目要求:</span>
实现带括号的四则运算。
实现思想:
创建两个栈,保存数字和符号,根据运算级的高低,确定弹栈以及压栈(栈为模板类,因为有两个不同类型的栈)。
代码
#include<iostream>
#define MAX 50
using namespace std;
template<typename T> class myStack
{
private:
T data[MAX];
int size;
public:
myStack()
{
size=0;
}
void push(T a)
{
data[size]=a;
size++;
}
T pop()
{
T a=data[--size];
return a;
}
T getTop()
{
T a=size-1;
return data[a];
}
int getSize()
{
return size;
}
bool isEmpty()
{
return size==0;
}
};
float oper(myStack<int> &aa,myStack<char> &bb) //栈顶运算
{
float v1,v2,v;
char op;
op=bb.pop();
v2=aa.pop();
v1=aa.pop();
switch(op)
{
case'+':v=v1+v2;break;
case'-':v=v1-v2;break;
case'*':v=v1*v2;break;
case'/':v=v1/v2;break;
}
aa.push(v);
return v;
}
int main(int argc, char** argv)
{
myStack<int> a;
myStack<char> b;
char c;
int i;
cin>>c;
int j=1;
while(c!='#')
{
if(c!=42&&c!=40&&c!=41&&c!=43&&c!=45&&c!=47)
{
if(j==1)
a.push(c-'0');
else
{
if(j==2)
{
int ja=c-'0';
int jb=a.pop();
a.push(jb*10+ja);
}
else
{
int ja=c-'0';
int jb=a.pop();
int jc=a.pop();
a.push(jc*100+jb*10+ja);
}
}
j++;
}
else
{
j=1;
switch(c)
{
case'(':b.push(c);
break;
case')':while(b.getTop()!='(')
{
// int i;
oper(a,b);
// i=a.getTop();
}
b.pop();
break;
case'+':;
case'-':while(!b.isEmpty()&&b.getTop()!='('&&b.getTop()!='*')
oper(a,b);
b.push(c);
break;
case'*':;
case'/':while(b.getTop()=='*'||b.getTop()=='/')
oper(a,b);
b.push(c);
break;
i=a.getTop();
}
}
i=a.getTop();
cin>>c;
}
while(!b.isEmpty())
{
oper(a,b);
i=a.getTop();
}
i=a.getTop();
cout<<a.pop();
return 0;
}