#include <stdio.h>
#include<stdlib.h>
#include "LinkStack.h"
int isNumber(char c)
{
return c >= '0'&&c <= '9';
}
int isOperator(char c)
{
return c == '+' || c == '-' || c == '*' || c == '/';
}
int Value(char c)
{
return c - '0';
}
int Express(int left, int right, char op)
{
int ret = 0;
switch (op)
{
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 Compute(char *c)
{
int ret = 0;
int i = 0;
LinkStack *stack = LinkStack_Create();
while (c[i] != '\0')
{
if (isNumber(c[i]))//若是数字则入栈
{
LinkStack_Push(stack, (void *)Value(c[i]));
}
else if (isOperator(c[i]))//若是操作符则:
{
int right = (int)LinkStack_Pop(stack);//弹出栈顶元素作为右值
int left = (int)LinkStack_Pop(stack);//再弹出栈顶元素作为左值
int result = Express(left, right, c[i]);//计算左右值运算结果
LinkStack_Push(stack, (void *)result);//将结果压入栈
}
else
{
printf("invalid expression!");
}
i++;
}
if (LinkStack_Size(stack) == 1 && c[i] == '\0')//当栈内只剩一个元素且字符串为空时,栈内元素即为最终结果
{
ret = (int)LinkStack_Pop(stack);
}
else
{
printf("invilad expression!\n");
}
LinkStack_Destroy(stack);
return ret;
}
int main()
{
printf("8 + (3 - 1) * 5 = %d\n", Compute("831-5*+"));
system("pause");
return 0;
}
栈的应用之后缀计算
最新推荐文章于 2021-11-13 16:35:13 发布