栈与队列应用:逆波兰计算器(逆波兰表达式;后缀表达式)把运算符放到运算量后边 && 中缀表达式转化为后缀表达式
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---->出栈,弹栈 ...
随机推荐
- Hugging News #0807: ChatUI 官方 Docker 模板发布、🤗 Hub 和开源生态介绍视频来啦!
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- 使用MediatR实现CQRS
CQRS和中介者模式 MediatR库主要是为了帮助开发者快速实现两种软件架构模式:CQRS和Mediator.这两种架构模式看上去似乎差不多,但还是有很多区别的. CQRS CQRS是Command ...
- Matlab机器人工具箱安装教程
参考以下博客 https://blog.csdn.net/AprilsHell/article/details/90722892
- 让 GPT-4 来修复 Golang “数据竞争”问题 - 每天5分钟玩转 GPT 编程系列(6)
目录 1. Golang 中的"数据竞争" 2. GoPool 中的数据竞争问题 3. 让 GPT-4 来修复数据竞争问题 3.1 和 GPT-4 的第一轮沟通 3.2 和 GPT ...
- Ansible快速复习
本文章是上一篇ansible自动化运维的快速复习以及项目上用到的一些命令,针对长时间未使用ansible,导致命令忘记的同学,帮助快速回忆.详细内容还是看上一章'ansible自动化运维'. 查看版本 ...
- 如何让WPF中的ValidationRule实现参数绑定
背景 应用开发过程中,常常会对用户输入内容进行验证,通常是基于类型.范围.格式或者特定的要求进行验证,以确保输入符合预期.例如邮箱输入框校验输入内容是否符合邮箱格式.在WPF中,数据模型允许将Vali ...
- AI绘画工具MJ新功能有点东西,小白也能轻松一键换装
先看最终做出来的效果 直接来干货吧.Midjourney,下面简称MJ 1.局部重绘功能来袭 就在前两天,MJ悄咪咪上线了这个被众人期待的新功能:局部重绘. 对于那些追求创新和个性化的设计师来说,局部 ...
- 《最新出炉》系列入门篇-Python+Playwright自动化测试-15-playwright处理浏览器多窗口切换
1.简介 浏览器多窗口的切换问题相比大家不会陌生吧,之前宏哥在java+selenium系列文章中就有介绍过.大致步骤就是:使用selenium进行浏览器的多个窗口切换测试,如果我们打开了多个网页,进 ...
- Elasticsearch之常用术语
一. 数据库和ES简单类比 关系型数据库 表(Table) 行(Row) 列(Cloumn) Schema SQL Elasticsearch 索引(Index) 文档(Document) 字段(Fi ...
- 使用极速全景图下载大师下载720yun全景图片(一键下载建E、720云全景原图)
VR全景图片下载 软件简介 极速全景图下载大师下载地址: 点击进入下载页面 极速全景图下载大师(VR全景图下载器)软件官网: 点击进入官网 极速全景图下载大师如何下载720yun全景图片 1.首先,在 ...