栈应用 - 后缀表达式的计算
来源:互联网 发布:英雄联盟 魔兽世界知乎 编辑:程序博客网 时间:2024/05/22 07:49
有关栈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
0 0
- 栈应用 - 后缀表达式的计算
- 后缀表达式计算-栈的应用
- 栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)
- Chapter4:栈的应用-后缀表达式的计算
- 栈的应用——后缀表达式的计算
- 栈的应用之后缀表达式的计算(同时验证是否为合法的后缀表达式)
- 栈的应用--算术表达式的求值(中缀转后缀然后计算后缀表达式的值)
- 基于栈的应用之计算后缀表达式
- 栈的应用--表达式计算&中缀转后缀
- 计算后缀表达式的值(栈应用二)
- 后缀表达式计算——栈的应用
- 数据结构::如何计算后缀表达式--栈的一个小应用
- 栈的应用---后缀表达式
- 栈的应用-后缀表达式
- 栈的应用 ---后缀表达式
- 后缀表达式的计算
- 后缀表达式的计算
- 后缀表达式的计算
- LightOJ 1070 Algebraic Problem (推导+矩阵快速幂)
- java io
- NSObject
- IOS开发中,SVN如何恢复到某一个版本(以Cornerstone为例)
- Linux从程序到进程
- 栈应用 - 后缀表达式的计算
- android paint的抗锯齿效果
- 轮播图的实现
- OC 基础之--- 多态,内存管理,@class和@ import
- OSChina客户端源码学习(1)--Android与Server的交互
- 跟着实例学习设计模式(8)-适配器模式adapter(结构型)
- 简单破解的简单步骤
- 基本数据结构之二叉树
- python 文件操作