栈的应用---后缀运算法则
·对于数字:进栈
·对于符号:
·从栈中弹出右操作数
·从栈中弹出左操作数
·依据符号进行运算
·将运算结果压入栈中
·遍历结果:栈中唯一的数字为结果
伪算法
int compute (const char * exp)
{
创建栈
int i = 0;
While (exp[i] != ‘\0’)
{
if(数字)
输出
Else if (假设是符号)
{
Int right = 左操作数出栈(此时在栈顶)
Int left = 右操作数出栈 (此时栈顶)
Int result = 左操作数与有操作数关于运算符的结果
结果进栈
}
Else
报错
}
If (栈中仅仅有一个数字并且遍历完成)
结果出栈
Else
报错
Return 返回结果;
}
代码:
#include <stdio.h>
#include "LinkStack.h"
int isNumber(char c)
{
return ('0' <= c) && (c <= '9');
}
int isOperator(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( isNumber(exp[i]) )
{
LinkStack_Push(stack, (void*)value(exp[i]));
}
else if( isOperator(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("9 + (3 - 1) * 5 + 8 / 2 = %d\n", compute("931-5*+82/+"));
return 0;
}
与中缀转后缀合用。能够变成计算器的程序
相关文章
- 数字孪生行业应用场景
- Apifox --- 全套服务提升了团队效率,让研测之间充满了爱(记Apifox在工程中的实际应用)【云原生】
- Netty源码实战(十一) --- 设计模式的应用
- 技术架构+应用场景揭秘,为什么高斯Redis比开源香?
- PHPUnit 在phpstrom中composer项目的应用配置
- 《H5+移动应用实战开发》已出版
- C++哈希应用-位图/布隆过滤器/海量数据处理
- 2015-03-12---外观模式,建造者模式(附代码),观察者模式(附代码),boost库应用
- 刘世锦:大数据应用助力产业升级
- 在C#代码中应用Log4Net(五)将Log4Net正确地封装在自己的类库中并进行调用
- 数商云采购商城价格管理应用场景介绍 | 数字化采购助力汽配行业企业降本增效
- C#图像处理-OpenCVSharp教程(二十三) OpenCVSharp轮廓特征属性及应用(一)---凸包
- 趣味应用 | 用OpenCV自动给图片添加彩虹特效---平淡的生活需要技术的点缀
- 算法分析(蛮力法与减治算法应用实验报告)
- ExtJS教程(5)---Ext.data.Model之高级应用
- opencv(21)---轮廓属性特征以及应用之凹包
- 车载机器视觉技术在智能交通系统中的辅助应用
- 安卓应用栏的滚动效果
- C语言高级应用---操作linux下V4L2摄像头应用程序