栈与队列应用:逆波兰计算器(逆波兰表达式;后缀表达式)把运算符放到运算量后边 && 中缀表达式转化为后缀表达式
1 //1.实现对逆波兰输入的表达式进行计算如(2-1)*(2+3)= 5 就输入2 1 - 2 3 + * //先把2 1 压栈 遇到-弹栈 再把2 3压进去 遇到+弹栈 最后遇到*弹栈
2 //2.支持带小数点的数据
3 例: 正常操作----->逆波兰表达式
4 a+b ------>a b +
5 a+(b-c)----->a b c - +
6 a+(b-c)*d--->a b c - d * +
7 a+d*(b-c)--->a d b c - * +
8
9 //2 5 + 4 2 - * == (2+5)*(4-2) == 14
10 //1 34 + 4 2 / * ==(1+34)*(4/2)== 70
11 #include<stdio.h>
12 #include<stdlib.h>
13 #include<ctype.h> //函数isdigit 检查是否为十进制数
14
15 #define MAXSIZE 100
16 #define MAXBUFFER 10 //缓冲区
17
18 typedef double ElemType;
19
20 typedef struct
21 {
22 ElemType *base;
23 ElemType *top;
24 int sizeStack;
25 }sqStack;
26
27 void InitStack(sqStack *s)
28 {
29 s->base = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
30 if(!s->base)
31 {
32 exit(0);
33 }
34 s->top = s->base;
35 s->sizeStack = MAXSIZE;
36 }
37
38 void Push(sqStack *s,ElemType e)
39 {
40 if(s->top - s->base == s->sizeStack)
41 {
42 exit(0);
43 }
44 *(s->top) = e;
45 s->top++;
46 }
47
48 void Pop(sqStack *s,ElemType *e)
49 {
50 if(s->top == s->base)
51 {
52 return;
53 }
54 *e = *(--(s->top));
55 }
56
57 int main(void)
58 {
59 sqStack s;
60 char c;
61 char str[MAXBUFFER];
62 double d,e;
63 int i = 0;
64
65 InitStack(&s);
66 printf("请输入后缀表达式的字符,运算符与数字用空格隔开\n");
67 scanf("%c",&c);
68 while(c != '#')
69 {
70 while(isdigit(c) || c=='.') //判断是否遇到数字
71 {
72 str[i++] = c;
73 str[i] = '\0';
74 if(i >= 10)
75 {
76 printf("单个数字太大啊");
77 return -1;
78 }
79 scanf("%c",&c);
80 if(c == ' ')
81 {
82 d = atof(str); //将字符串转换成浮点型 存在<stdlib.h>
83 Push(&s,d);
84 i = 0;
85 break;
86 }
87 }
88
89 switch(c) //判断是否遇到运算符
90 {
91 case '+':
92 Pop(&s,&e);
93 Pop(&s,&d);
94 Push(&s,d+e);
95 break;
96 case '-':
97 Pop(&s,&e);
98 Pop(&s,&d);
99 Push(&s,d-e);
100 break;
101 case '*':
102 Pop(&s,&e);
103 Pop(&s,&d);
104 Push(&s,d*e);
105 break;
106 case '/':
107 Pop(&s,&e);
108 Pop(&s,&d);
109 if(e != 0)
110 {
111 Push(&s,d/e);
112 }
113 else
114 {
115 printf("被除数不能为0!\n");
116 return -1;
117 }
118 break;
119 }
120 scanf("%c",&c);
121 }
122 Pop(&s,&d);
123 printf("最终结果为:%f",d);
124 return 0;
125 }
126
127
128
129 //将中缀表达式转化为后缀表达式
130 #include<stdio.h>
131 #include<stdlib.h>
132
133 #define MAXSIZE 20
134 #define INCREMENTSIZE 10
135
136 typedef char ElemType;
137 typedef char ElemType2;
138 typedef struct
139 {
140 ElemType *base;
141 ElemType *top;
142 int StackSize;
143 }sqStack;
144
145 void InitStack(sqStack *s)
146 {
147 s->base = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
148 if(!s->base)
149 {
150 printf("内存分配失败!\n");
151 exit(0);
152 }
153 s->top = s->base;
154 s->StackSize = MAXSIZE;
155 }
156
157 void Push(sqStack *s, ElemType e)
158 {
159 if(s->top - s->base == s->StackSize)
160 {
161 s->base = (ElemType *)realloc(s->base,(s->StackSize+INCREMENTSIZE)*sizeof(ElemType));
162 if(!s->base)
163 {
164 printf("重新分配内存失败!\n");
165 exit(0);
166 }
167 s->top=s->base+s->StackSize;
168 s->StackSize=s->StackSize+INCREMENTSIZE;
169 }
170 *(s->top) = e;
171 s->top++;
172 }
173
174 void Pop(sqStack *s,ElemType *e)
175 {
176 if(s->top == s->base)
177 {
178 return;
179 }
180 *e = *(--(s->top));
181 }
182
183 int StackLen(sqStack s)
184 {
185 return (s.top - s.base);
186 }
187
188 int main(void)
189 {
190 sqStack s;
191 char c,e;
192
193 InitStack(&s);
194 printf("请输入中缀表达式\n");
195 scanf("%c",&c);
196 while(c !='#')
197 {
198
199 while(c>='0' && c<='9')
200 {
201 printf("%c",c);
202 scanf("%c",&c);
203 if(c<'0' || c>'9')
204 {
205 printf(" ");
206 }
207 }
208
209 if(c==')')
210 {
211 Pop(&s,&e);
212 while(e != '(')
213 {
214 printf("%c ",e);
215 Pop(&s,&e);
216 }
217 }
218 else if(c=='+' || c=='-')
219 {
220 if(!StackLen(s))
221 {
222 Push(&s,c);
223 }
224 else
225 {
226 do
227 {
228 Pop(&s,&e);
229 if(e == '(')
230 {
231 Push(&s,e); //遇到左括号就弹走就ok
232 }
233 else
234 {
235 printf("%c ",e);
236 }
237
238 }while(StackLen(s) && e!='(');
239 Push(&s,c);
240 }
241 }
242 else if(c=='/' || c=='*' || c=='(')
243 {
244 Push(&s,c);
245 }
246 else if(c == '#')
247 {
248 break;
249 }
250 else
251 {
252 printf("数据输入错误啊!\n");
253 return -1;
254 }
255 scanf("%c",&c);
256 }
257 while(StackLen(s))
258 {
259 Pop(&s,&e);
260 printf("%c ",e);
261 }
262 return 0;
263 }
栈与队列应用:逆波兰计算器(逆波兰表达式;后缀表达式)把运算符放到运算量后边 && 中缀表达式转化为后缀表达式的更多相关文章
- C#数据结构与算法系列(十):逆波兰计算器——逆波兰表达式(后缀表达式)
1.介绍 后缀表达式又称逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后 2.举例说明 (3+4)*5-6对应的后缀表达式就是3 4 +5 * 6 - 3.示例 输入一个逆波兰表达式(后缀表达 ...
- SDUT-2133_数据结构实验之栈与队列三:后缀式求值
数据结构实验之栈与队列三:后缀式求值 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运算符的后缀表示式 ...
- 6, java数据结构和算法: 栈的应用, 逆波兰计算器, 中缀表达式--> 后缀表达式
直接上代码: public class PolandCalculator { //栈的应用:波兰计算器: 即: 输入一个字符串,来计算结果, 比如 1+((2+3)×4)-5 结果为16 public ...
- 怎么实现Linux下的逆波兰计算器dc?
#返回上一级 @Author: 张海拔 @Update: 2014-01-12 @Link: http://www.cnblogs.com/zhanghaiba/p/3516660.html /* * ...
- 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes
表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明. 本章学习重点: 理解抽象数据类 ...
- Java数据结构和算法 - 栈和队列
Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...
- LeetCode通关:栈和队列六连,匹配问题有绝招
刷题路线参考: https://github.com/chefyuan/algorithm-base https://github.com/youngyangyang04/leetcode-maste ...
- LeetCode入门指南 之 栈和队列
栈 155. 最小栈 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top( ...
- python 下的数据结构与算法---4:线形数据结构,栈,队列,双端队列,列表
目录: 前言 1:栈 1.1:栈的实现 1.2:栈的应用: 1.2.1:检验数学表达式的括号匹配 1.2.2:将十进制数转化为任意进制 1.2.3:后置表达式的生成及其计算 2:队列 2.1:队列的实 ...
- 课堂笔记及知识点----栈和队列(2018/10/24(am))
栈: Stack<int> xt=new Stack<int>() ; 先进后出,后进先出,水杯结构,顺序表类似 常用方法: .pop---->出栈,弹栈 ...
随机推荐
- AttributeError: 'EmailUse' object has no attribute 'SendMail'
错误原因:函数名与模块名重复 解决方案:不要将函数名与模块名重复
- [k8s]使用nfs挂载pod的应用日志文件
前言 某些特殊场景下应用日志无法通过elk.grafana等工具直接查看,需要将日志文件挂载出来再处理.本文以nfs作为远程存储,统一存放pod日志. 系统版本:CentOS 7 x86-64 宿主机 ...
- 基于weave实现docker跨主机网络通信
前言 IP: 192.168.0.10 192.168.0.11 系统版本:centos 7 weave版本:2.8.1,下载地址:https://git.io/weave docker版本:18.0 ...
- c#如何使用WASM跨语言调用?
介绍Wasm(WebAssembly) WebAssembly(简称Wasm)是一种用于基于堆栈的虚拟机的二进制指令格式.Wasm被设计为编程语言的可移植编译目标,支持在web上部署客户端和服务器应用 ...
- next.js 源码解析 - getStaticProps、getStaticPaths 篇
好久前写了关于 getStaticProps 和 getStaticPaths 的内容,然而半年过去了源码解析就一直忘记了,不久前有人提醒才想起来,补下坑. 本文主要是解读下 getStaticPro ...
- KVM下windows由IDE模式改为virtio模式蓝屏 开不开机
KVM安装Windows默认使用的是qemu虚拟化IDE硬盘模式,在这种情况下,IO性能比较低,如果使用virtio的方式可以提高虚拟机IO性能. 于是我想将这台虚拟机迁移到openstack中管理 ...
- 优化Redis缓存淘汰机制解决性能测试中报错率逐渐攀升问题
在某个查询场景的性能测试过程中,遇到了一个问题:测试过程中报错率逐渐攀升.进一步检查后发现,在查询业务所在应用的后台日志和平台应用的后台日志中,都出现了用户登录相关的报错信息.经过排查分析,发现了问题 ...
- 《SQL与数据库基础》20. 主从复制
目录 主从复制 原理 搭建 主库配置 从库配置 测试 本文以 MySQL 为例 主从复制 主从复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执 ...
- MediaBox助力企业一站式获取音视频能力
以一只音视频百宝箱,应对「千行千面」. 洪炳峰.楚佩斯|作者 大家好,今天我分享的主题是MediaBox--行业音视频数字化再加速. 根据权威数据表明,65%的行业数字化信息来自视频,基于此,音视频技 ...
- nginx ServerName匹配规则
1.同一个主机配置不同端口,访问不同资源 worker_processes 1; events { worker_connections 1024; } http { include mime.typ ...