中缀转后缀算法步骤:

 遍历中缀表达式中的数字和符号
对于数字:直接输出 :直接输出
对于符号:
• 左括号:进栈 :进栈
• 符号:与栈顶符号进行优先级比较 :与栈顶符号进行优先级比较
• 栈顶符号优先级低:进栈 :进栈
• 栈顶符号优先级不低:将栈顶符号弹出并输出 :将栈顶符号弹出并输出,之后进栈 ,之后进栈
• 右括号:将栈顶符号弹出并输出 :将栈顶符号弹出并输出,直到匹配左括号 ,直到匹配左括号
遍历结束:将栈中的所有符号弹出并输出 :将栈中的所有符号弹出并输出

中缀转后缀算法框架:

数据结构:栈的应用_表达式计算_C语言


计算后缀以表达式算法步骤:

遍历后缀表达式中的数字和符号
对于数字:进栈 :进栈
对于符号:
• 从栈中弹出右操作数
• 从栈中弹出左操作数
• 根据符号进行运算
• 将运算结果压入栈中
遍历结束:栈中的唯一数字为计算结果 :

计算后缀以表达式算法框架:

数据结构:栈的应用_表达式计算_优先级_02


根据国嵌唐老师的课,用C语言实现:

数据结构:栈的应用_表达式计算_数据结构_03


main.c

#include <stdio.h>
#include <stdlib.h>
#include "LinkStack.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int isNumber(char c)
{
return ('0'<=c)&&(c<='9');
}

int value(char c)
{
return (c-'0');
}

int isOperator(char c)
{
return (c=='+')||(c=='-')||(c=='*')||(c=='/');
}

int isLeft(char c)
{
return (c=='(');
}

int isRight(char c)
{
return (c==')');
}

int priority(char c)
{
int ret = 0;

if((c=='+')||(c=='-'))
{
ret = 1;
}

if((c=='*')||(c=='/'))
{
ret = 2;
}

return ret;
}

void output(char c)
{
if(c!='\0')
{
printf("%c",c);
}
}

void transform(const char* exp)
{
LinkStack* stack = LinkStack_Create();
int i = 0;

while(exp[i]!='\0')
{
if(isNumber(exp[i]))
{
output(exp[i]);
}
else if(isOperator(exp[i]))
{
while(priority(exp[i])<=priority((char)(int)LinkStack_Top(stack)))
{
output((char)(int)LinkStack_Pop(stack));
}

LinkStack_Push(stack,(void*)(int)exp[i]);
}
else if(isLeft(exp[i]))
{
LinkStack_Push(stack,(void*)(int)exp[i]);
}
else if(isRight(exp[i]))
{
char c = '\0';

while(!isLeft((char)(int)LinkStack_Top(stack)))
{
output((char)(int)LinkStack_Pop(stack));
}

LinkStack_Pop(stack);
}
else
{
printf("Invalid expression!");
break;
}

i++;
}

while((LinkStack_Size(stack)>0)&&(exp[i]=='\0'))
{
output((char)(int)LinkStack_Pop(stack));
}

LinkStack_Destroy(stack);
}

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(const char* exp)
{
LinkStack* stack = LinkStack_Create();
int ret = 0;
int i = 0;

while(exp[i]!='\0')
{
if(isNumber(exp[i]))
{
LinkStack_Push(stack,(void*)value(exp[i]));
}
else if(isOperator(exp[i]))
{
int right = (int)LinkStack_Pop(stack);
int left = (int)LinkStack_Pop(stack);
int result = express(left,right,exp[i]);

LinkStack_Push(stack,(void*)result);
}
else
{
printf("Invalid expression!");
break;
}

i++;
}

if((LinkStack_Size(stack)==1)&&(exp[i]=='\0'))
{
ret = (int)LinkStack_Pop(stack);
}
else
{
printf("Invalid expression!");
}

LinkStack_Destroy(stack);

return ret;
}
int main(int argc, char *argv[])
{
transform("9+(3-1)*5+8/2");

printf("\n");

printf("%d",compute("931-5*+82/+"));

printf("\n");

return 0;
}

运行效果:

数据结构:栈的应用_表达式计算_优先级_04