C语言中缀表达式转后缀表达式
时间:2022-07-25
本文章向大家介绍C语言中缀表达式转后缀表达式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
众所周知,计算机中不能直接用中缀表达式计算,形如(1+2)*(4-5)之类的,但是我们可以计算机可以很容易的通过后缀表达式来计算我们所输入的算式。所以我们就需要把中缀表达式转换为后缀表达式。下面是个人写的一点代码,大家可以参考。
开始
添加适当的头文件,定义一个栈数据结构,
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef char ElemType;
typedef struct
{
ElemType *base;
ElemType *top;
int stackSize;
}SqStack;
创建一个栈
//创建一个栈
void initStack(SqStack *s) {
s->base = (ElemType *)malloc(sizeof(ElemType));
if (!s->base)
{
exit(0);
}
s->top = s->base; //最开始 栈底就是栈顶
s->stackSize = STACK_INIT_SIZE;
}
入栈操作
void Push(SqStack *s, ElemType e) {
//如果栈满 追加空间
if (s->top - s->base >= s->stackSize)
{
s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
if (!s->base)
{
exit(0);
}
s->top = s->base + s->stackSize; //设置栈顶
s->stackSize = s->stackSize + STACKINCREMENT;
}
*(s->top) = e;
s->top++;
}
出栈操作
void Pop(SqStack *s, ElemType *e) {
if (s->top == s->base)
{
return;
}
*e = *--(s->top);
}
计算栈的当前容量(最大容量是s.stackSize)
int StackLen(SqStack s) {
return (s.top - s.base);
}
主函数
int main() {
char cal[50];
char c, e;
SqStack s;
initStack(&s);
printf("请输入中缀表达式 输入#表示结束n");
scanf_s("%c", &c);
while (c != '#')
{
while (c>='0' && c<='9')
{
printf("%c ", c);
scanf_s("%c", &c);
if (c<'0' || c>'9')
{
printf(" ");
}
}
if (c == ')')
{
Pop(&s, &e);
while (e != '(')
{
printf("%c ", e);
Pop(&s, &e);
}
}
else if (c == '+' || c == '-')
{
if (!StackLen(s))
{
Push(&s, c);
}
else {
do
{
Pop(&s, &e);
if (e == '(')
{
Push(&s, e);
}
else {
printf("%c ", e);
}
} while (StackLen(s) && e!='(');
Push(&s, c);
}
}else if (c=='*' || c=='/' || c=='(')
{
Push(&s, c);
}else if (c=='#')
{
break;
}
else {
printf("出错,输入格式错误");
return -1;
}
scanf_s("%c", &c);
}
while (StackLen(s))
{
Pop(&s, &e);
printf("%c ", e);
}
return 0;cd
}
本人用的是vs2015编译器,所以文中的scanf用了更安全的scanf_s, 如有引用 请自觉替换成和自己的编译器想匹配的函数 代码很简单 ,仔细看看研究一下指针就很容易看懂,
注:
- 上述代码在visual studio 2015中编译成功运行,其他ide请自行测试
- 上述文字皆为个人看法,如有错误或建议请及时联系我
- ASP.NET MVC5+EF6+EasyUI 后台管理系统--系统权限全套完整图
- 互联网时代的产品升级和用户反馈故事
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(50)-Easyui 扁平化皮肤
- 微信终于做了它最擅长的业务,市场已经轰动
- Bootstrap Metronic 学习记录(二)菜单栏
- WCF技术剖析之十一:异步操作在WCF中的应用(上篇)
- Bootstrap Metronic 学习记录(一)简介
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(49)-工作流设计-我的申请
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(47)-工作流设计-补充
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(46)-工作流设计-设计分支
- 瑞典研发未来概念车,车厢、底盘能分离,颠覆汽车使用方式
- WCF技术剖析之十一:异步操作在WCF中的应用(下篇)
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(45)-工作流设计-设计步骤
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(44)-工作流设计-设计表单
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浅谈Python中os模块及shutil模块的常规操作
- Python decorator拦截器代码实例解析
- 实验4.1 编码裁剪算法(鼠标交互版)
- python实现对变位词的判断方法
- python实现一个猜拳游戏
- 实验5 OpenGL二维几何变换
- Python关键字及可变参数*args,**kw原理解析
- 实验6 OpenGL模型视图变换
- python学生管理系统的实现
- 详解Android使用Handler造成内存泄露的分析及解决方法
- android使用flutter的ListView实现滚动列表的示例代码
- 实验7 3D机器人
- EasyValidate优雅地校验提交数据完整性
- 实验8 OpenGL太阳系动画
- Django实现列表页商品数据返回教程