算法思路:
1: if操作数 -> 入栈
2: if ( -> 入栈
3: if +/-
3.1: if 栈顶不是( -> 弹出一个运算符,弹出两个运算数,把结果入栈
3.2:if栈顶为空或( ->入栈
4:if *//
4.1: if 栈顶是*// -> 弹出一个运算符,弹出两个运算数,把结果入栈
4.2: if 栈顶为空或者不是*// -> 入栈
5: if )
5.1: if栈顶不是( -> 弹出一个运算符,弹出两个运算数,把结果入栈
5.2:if栈顶是( -> 弹出(
6 : if ;
6.1 : if栈不为空 -> 弹出一个运算符,弹出两个运算数,把结果入栈
6.2 :if栈为空 -> 结束
碰到比当前运算符级别高的 -> 入栈
碰到比当前运算符级别低的 -> 运算,入栈
算法实现:
//链接栈
struct node
{
int data;
node* next;
};
//向t指向的链接栈,入栈x
void push(node* &t,int x)
{
node temp = new node();
temp.data = x;
temp.next = t;
t = &temp;
}
//返回值为出栈的元素的值
int pop(node* &t)
{
if(t == NULL)
{
return -1;
}
else
{
node* p = t;
t = t->next;
int iReturn = p->data;
delete p;
return iReturn;
}
}
#define n0 30
int s1[n0]; //运算数栈
char s2[n0]; //运算符号栈
int t1,t2; //t1 : 指向运算数栈s1栈顶,t2:指向运算符栈s2栈顶
//一次运算操作
void calcu()
{
char p; //运算符
int x1,x2,x;//运算数
p = s2[t2--]; //运算符出栈
x2 = s1[t1--];
x1 = s1[t1--];
switch (p)
{
case '+':
x = x1 + x2;
break;
case '-':
x = x1 - x2;
break;
case '*':
x = x1 * x2;
break;
case '/':
x = x1 / x2;
break;
}
//运算结果入栈
s1[++t1] = x;
}
//表达式求值
void calculator()
{
char c; //操作符号
int v; //操作数
t1 = t2 = 0; //栈清空
cin>>c
while(c != ';')
{
switch(c)
{
case '(':
// ( 入栈
s2[t2++] = c;
cin>>c;
break;
case '+':case '-':
//如果栈顶不是(,计算
while(t2 && s2[t2] != '(')
{//当t2不为0,并且...
calcu();
}
else
{
}
s2[t2++] = c; //当前的运算符进栈
cin>>c;
break;
case '*':case '/':
//如果栈顶为*//,计算
if(t2 && s2[t2] == '/' || s2[t2] == '*')
{
calcu();
}
else
{//如果栈顶为空或者不是*//,入栈
}
s2[t2++] = c;
cin>>c;
break;
case ')':
//if栈顶是(,弹出
while(s2[t2] != '(')
{
calcu();
}
t2--;
cin>>c;
break;
default: //所有的default都认为是数字
//注意数字也是一个一个输入进去的 1234
v = 0;
do
{
v = v*10 + c-'0';
cin>>c;
} while (c>='0'&& c<='9');
s1[t1++] = v;
break;
}
}
//遇到了;
while(t2)
{
calcu();
}
if(t2 == 0)
{//如果运算符栈里空了
return s1[t1];
}
else
{
return -1;//表示错误,很不严谨
}
}