有关栈API详情请参看我的另一篇博文:栈的链式存储 - API实现
实例:
5 + 4=> 5 4 +
1 + 2 * 3 => 1 2 3 * +
8 + ( 3 – 1 ) * 5 => 8 3 1 – 5 * +
中缀表达式符合人类的阅读和思维习惯
后缀表达式符合计算机的“运算习惯”
中缀转后缀算法:
遍历中缀表达式中的数字和符号
对于数字:直接输出
对于符号:
左括号:进栈
运算符号:与栈顶符号进行优先级比较
若栈顶符号优先级低:此符合进栈 (默认栈顶若是左括号,左括号优先级最低)
若栈顶符号优先级不低:将栈顶符号弹出并输出,之后进栈
右括号:将栈顶符号弹出并输出,直到匹配左括号
遍历结束:将栈中的所有符号弹出并输出
中缀转后缀
主要代码:
#include "stdio.h" #include "stdlib.h" #include "string.h" #include "linkstack.h" int isNumber(char c) { return ('0' <= c) && (c <= '9'); } 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) { int i = 0; LinkStack* stack = LinkStack_Create(); 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 main() { transform("8+(3-1)*5"); printf("\n"); system("pause"); return 0; }
完整工程详情:Github
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-12-10 15:53:17