栈应用 - 后缀表达式的计算
2015-07-13 19:48
525 查看
有关栈API详情参看我的另一篇博文: 栈的链式存储 - API实现
遍历后缀表达式中的数字和符号
对于数字:进栈
对于符号:
从栈中弹出右操作数
从栈中弹出左操作数
根据符号进行运算
将运算结果压入栈中
遍历结束:栈中的唯一数字为计算结果
遍历后缀表达式中的数字和符号
对于数字:进栈
对于符号:
从栈中弹出右操作数
从栈中弹出左操作数
根据符号进行运算
将运算结果压入栈中
遍历结束:栈中的唯一数字为计算结果
#include <stdio.h> #include "LinkStack.h" int isNumber3(char c) { return ('0' <= c) && (c <= '9'); } int isOperator3(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(const char* exp) { LinkStack* stack = LinkStack_Create(); int ret = 0; int i = 0; while (exp[i] != '\0') { if (isNumber3(exp[i])) { LinkStack_Push(stack, (void*)value(exp[i])); } else if (isOperator3(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() { printf("8 + (3 - 1) * 5 = %d\n", compute("831-5*+")); return 0; }工程文件详情:Github
相关文章推荐
- 数据挖掘求职岗位要求分析
- NGUI ScrollView总结
- virtualenv and virtualenvwrapper on Ubuntu 14.04
- 基本数据结构之二叉树
- 关于rman duplicate 一些比较重要的知识点--系列三
- OSChina客户端源码学习(1)--Android与Server的交互
- 简单破解的简单步骤
- Find Minimum in Rotated Sorted Array(旋转数组的最小数字)
- ccBPM典型的树形表单和多表头表单的流程示例
- 浅谈HTTP中Get与Post的区别
- 轮播图的实现
- android paint的抗锯齿效果
- IOS开发中,SVN如何恢复到某一个版本(以Cornerstone为例)
- Linux从程序到进程
- 解决iOS下input和fixed 问题
- java io
- EasyUI-DataGrid多线动态实现选择性合并
- 栈的应用 - 中缀表达式转后缀表达式
- websphere MQ 编程指南(Java)
- 栈的应用 - 中缀表达式转后缀表达式