对于数字:进栈
进栈对于符号:
从栈中弹出右操作数
从栈中弹出左操作数
根据符号进行运算
将运算结果压入栈中
例子:831-5*+
- 8进栈
- 3进栈
- 1进栈
- 遇到-了,从栈中弹出右操作数,再左操作数,相减结果压栈(2压栈)
- 5进栈
- 从栈中弹出右,左相乘结果压栈(10压栈)
- 从栈中弹出右,左相加 结果为:18
以下代码需要包含循环栈的类(我博客里有)
main.cpp
//判断是否是数字
int IsNumber(char c)
{
return c >= '0'&&c <= '9';
}
typedef struct MYNUM
{
LinkNode node;
int val;
}MyNun;
//四则运算
int Caculate(int left, int right, char c)
{
int ret;
switch (c)
{
case '+':
ret = left + right;
break;
case '-':
ret = left - right;
break;
case '*':
ret = left * right;
break;
case '/':
ret = left / right;
break;
default:
break;
}
return ret;
}
int main()
{
char *str = "831-5*+";
linkstack* stack = new linkstack();
char* p = str;
while (*p != '\0')
{
//碰到数字直接压栈
if (IsNumber(*p))
{
MyNun* num = new MyNun;
num->val = *p - '0';
stack->push_back(stack->Stack, (LinkNode*)num);
}
else
{
//先从栈中弹出右操作符
MyNun* right = (MyNun*)stack->Top_LinkStack(stack->Stack);
int rightNum = right->val;
stack->pop_back(stack->Stack);
delete right;
//取出左操作符
MyNun* left = (MyNun*)stack->Top_LinkStack(stack->Stack);
int leftNum = left->val;
stack->pop_back(stack->Stack);
delete left;
//进行运算
int ret = Caculate(leftNum, rightNum,*p);
//结果入栈
MyNun* num = new MyNun;
num->val = ret;
stack->push_back(stack->Stack,(LinkNode*)num);
}
p++;
}
if (stack->Size_LinkStack(stack->Stack) == 1)
{
MyNun* num = (MyNun*)stack->Top_LinkStack(stack->Stack);
cout << "运算结果:" << num->val << endl;
stack->pop_back(stack->Stack);
delete num;
}
return 0;
}