//这计算器支持括号功能,格式例子3+(3*3)## ,后面打两个#算结束,还有阶乘和次方等功能留给同学们自己完善
#include <iostream>
using namespace std;
template<typename T>
struct Node
{//这个是数据结构模板,char和int都可以用
T data;
Node<T>* next;
};
template<typename T>
class stack
{
Node<T>* top;
public:
stack():top(NULL){}
void push(T n);
T pop();
bool stackEmpty();
T getTop();
~stack(){}
void print();
};
template<typename T>
void stack<T>::push(T n)
{
Node<T>* r=new Node<T>;
r->data=n;
r->next=top;
top=r;
}
template<typename T>
T stack<T>::pop()
{
Node<T> *ptr = top;
top = top->next;
T t=ptr->data;
delete ptr;
return t;
}
template<typename T>
void stack<T>::print()
{
for(Node<T>* p=top;p;p=p->next)
cout<<p->data<<" ";
}
template<typename T>
T stack<T>::getTop()
{
return top->data;
}
template<typename T>
bool stack<T>::stackEmpty()
{
if(top)return false;
else return true;
}
bool In(char t)
{//判断是否字符函数
if(t>='0'&&t<='9')return false;
else return true;
}
char Precede(char a,char b)
{运算符优先级函数
if(a=='('&&b==')'||a=='#'&&b=='#')
return '=';
else if(a=='(' || a=='#' || b=='(' || (a=='+'&&a=='-')&&(b=='*'||b=='/'))
return '<';
else return '>';
}
int Operate(int first,char t,int second)
{//运算函数
switch(t)
{
case '+':
return first+second;
case '-':
return first-second;
case '*':
return first*second;
case '/':
return first/second;
}
return 0;
}
int EvaluateExpression()
{
char theta,x;
int a,b;
stack<char>OPTR;//操作符
stack<int>OPND;//数字
OPTR.push('#');
string s;
cin>>s;
for(int i=0;i<s.length()-1;)
{
if (!In(s[i]))
{
int sum=s[i]-'0';
i++;
for(;!In(s[i])&&i<s.length()-1;i++)
{
int t=s[i]-'0';
sum=sum*10+t;
}
OPND.push(sum);
}// ch不是运算符则进OPND栈
else
switch (Precede(OPTR.getTop(),s[i]))
{ //比较OPTR的栈顶元素和ch的优先权
case '<': //当前字符ch压入OPTR栈,读入下一字符ch
OPTR.push(s[i]);
i++;
break;
case '>': //弹出OPTR栈顶的运算符进行相应运算,并将运算结果入栈
theta=OPTR.pop();
a=OPND.pop();
b=OPND.pop();
OPND.push(Operate(b,theta,a));
break;
case '=':
x=OPTR.pop();
i++;
break;
} // switch
} // while
return OPND.pop();
}
int main()
{
cout<<"帅成计算器支持括号版,格式:(表达式+##) 例:2+2##"<<endl;
for(;;)
{
cout<<EvaluateExpression();
cout<<endl;
}
return 0;
}