算法的基本流程
遍历中缀表达式中的数字和符号
对于数字:直接输出
对于符号:
左括号:进栈
运算符号:与栈顶符号进行优先级比较
若栈顶符号优先级低:此符合进栈 (默认栈顶若是左括号,左括号优先级最低)
若栈顶符号优先级不低:将栈顶符号弹出并输出,之后进栈
右括号:将栈顶符号弹出并输出,直到匹配左括号
遍历结束:将栈中的所有符号弹出并输出。
下面的代码是用之前的linkStack来实现的,没有借助于C++标准库,当然用C++标准库实现起来hi更优雅一点,笔记自己用C写的代码,还是有点难看的。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include "linkStack.h" bool isoperator(char op) { switch (op) { case ‘+‘: case ‘-‘: case ‘*‘: case ‘/‘: case ‘(‘: return 1; default: return 0; } } int priority(char op) { switch (op) { case ‘(‘: return 0; case ‘+‘: case ‘-‘: return 1; case ‘*‘: case ‘/‘: return 2; default: return -1; } } void handle(char *s) { linkStack* stack = linkStack_Create(); int len = strlen(s); for(int i=0; i<len; ++i) { if(isoperator(s[i])) { //如果栈为空或者是操作符为‘(‘就直接进栈了 if(linkStack_Size(stack)==0 || s[i] == ‘(‘) { linkStack_Push(stack,&s[i]); continue; } //优先级的判断 if(priority(s[i]) >= priority(*((char*)linkStack_Top(stack)))) { linkStack_Push(stack,&s[i]); }else { printf("%c", *((char*)linkStack_Pop(stack))); linkStack_Push(stack,&s[i]); } }//准备出栈了 else if(s[i] == ‘)‘) { while(true) { char tmp = *((char*)linkStack_Pop(stack)); if(tmp == ‘(‘) break; printf("%c", tmp); } } else { printf("%c",s[i]); } }//将栈中的所有元素全部投弹出去 while(linkStack_Size(stack) > 0) { printf("%c", *((char*)linkStack_Pop(stack))); } } int main() { char mid_expre[] = "8+(3-1)*5"; handle(mid_expre); return 0; }//后续操作,将后缀表达式进行计算也是借助于栈的利用,不过就比较简单了相对来讲。
原文地址:https://www.cnblogs.com/randyniu/p/9176012.html
时间: 2024-10-09 23:05:45