栈的应用 - 中缀表达式转后缀表达式
2015-07-13 19:44
411 查看
有关栈API详情请参看我的另一篇博文:栈的链式存储 - API实现
实例:
5 + 4=> 5 4 +
1 + 2 * 3 => 1 2 3 * +
8 + ( 3 – 1 ) * 5 => 8 3 1 – 5 * +
中缀表达式符合人类的阅读和思维习惯
后缀表达式符合计算机的“运算习惯”
中缀转后缀算法:
遍历中缀表达式中的数字和符号
对于数字:直接输出
对于符号:
左括号:进栈
运算符号:与栈顶符号进行优先级比较
若栈顶符号优先级低:此符合进栈 (默认栈顶若是左括号,左括号优先级最低)
若栈顶符号优先级不低:将栈顶符号弹出并输出,之后进栈
右括号:将栈顶符号弹出并输出,直到匹配左括号
遍历结束:将栈中的所有符号弹出并输出
中缀转后缀
主要代码:
实例:
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
相关文章推荐
- LightOJ 1070 Algebraic Problem (推导+矩阵快速幂)
- sublimetext mac常用快捷键
- IOS中 什么是UITableView的索引放大镜字符
- OC 基础之----属性
- iOS 各种调试技巧豪华套餐
- java中Date的getTime()函数
- tomcat自动发布
- xcode 6.4 安装Alcatraz失败解决方法
- Android破解之Lic文件加密程序(首例)
- 学习记录——递归和堆栈
- hdu2604矩阵快速幂
- 分享功能 集成友盟分享
- Web应用启动时,后台自动启动一个线程
- 使用代码为textview设置drawableLeft
- [工具推荐]005.Axure RP Pro 7.0模拟C#TAB控件
- Lowest Common Ancestor of a Binary Tree leetcode236
- hdu2674 N! 找规律
- fancy2D 源码解析 1 TestCpp
- vs2013的文件保存格式-fatal error C1071: 在注释中遇到意外的文件结束
- code