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 }

栈与队列应用:逆波兰计算器(逆波兰表达式;后缀表达式)把运算符放到运算量后边 && 中缀表达式转化为后缀表达式的更多相关文章

  1. C#数据结构与算法系列(十):逆波兰计算器——逆波兰表达式(后缀表达式)

    1.介绍 后缀表达式又称逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后 2.举例说明 (3+4)*5-6对应的后缀表达式就是3 4 +5 * 6 - 3.示例 输入一个逆波兰表达式(后缀表达 ...

  2. SDUT-2133_数据结构实验之栈与队列三:后缀式求值

    数据结构实验之栈与队列三:后缀式求值 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运算符的后缀表示式 ...

  3. 6, java数据结构和算法: 栈的应用, 逆波兰计算器, 中缀表达式--> 后缀表达式

    直接上代码: public class PolandCalculator { //栈的应用:波兰计算器: 即: 输入一个字符串,来计算结果, 比如 1+((2+3)×4)-5 结果为16 public ...

  4. 怎么实现Linux下的逆波兰计算器dc?

    #返回上一级 @Author: 张海拔 @Update: 2014-01-12 @Link: http://www.cnblogs.com/zhanghaiba/p/3516660.html /* * ...

  5. 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes

    表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明. 本章学习重点: 理解抽象数据类 ...

  6. Java数据结构和算法 - 栈和队列

    Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...

  7. LeetCode通关:栈和队列六连,匹配问题有绝招

    刷题路线参考: https://github.com/chefyuan/algorithm-base https://github.com/youngyangyang04/leetcode-maste ...

  8. LeetCode入门指南 之 栈和队列

    栈 155. 最小栈 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top( ...

  9. python 下的数据结构与算法---4:线形数据结构,栈,队列,双端队列,列表

    目录: 前言 1:栈 1.1:栈的实现 1.2:栈的应用: 1.2.1:检验数学表达式的括号匹配 1.2.2:将十进制数转化为任意进制 1.2.3:后置表达式的生成及其计算 2:队列 2.1:队列的实 ...

  10. 课堂笔记及知识点----栈和队列(2018/10/24(am))

    栈: Stack<int>  xt=new Stack<int>() ; 先进后出,后进先出,水杯结构,顺序表类似 常用方法:   .pop---->出栈,弹栈     ...

随机推荐

  1. quarkus实战之八:profile

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<quarkus实战>系列 ...

  2. bash: pip3:未找到命令

    输入以下命令: 1 sudo apt-get install python3-pip 参考链接: https://www.cnblogs.com/banshaohuan/p/10963547.html

  3. django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported.

    django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing a ...

  4. Linux:通过ssh访问虚拟机

    好记性抵不过烂笔头.(过段时间用的时候,总要百度一下,别费这个时间了) 语法: ssh -p port username@IP #默认22端口,可省略"-p port",即:ssh ...

  5. Nginx Ingress Contoller 通过 Envoy 代理和 Jaeger 进行分布式追踪(二)

    1.概述 在<应用程序通过 Envoy 代理和 Jaeger 进行分布式追踪(一)>一文中,我们详细介绍了单个应用程序如何通过 Envoy 和 Jaeger 实现链路追踪的过程.然而,单独 ...

  6. CF939F Cutlet 题解

    题意简述 有一个正反面都为 \(0\) 的卡片,每过 \(1\) 分朝下那一面的数值就会增加 \(1\),你可以在几个区间的时间内翻转卡片,求经过 \(2n\) 秒后能否让这个卡片的正反面的数都为 \ ...

  7. 百亿补贴通用H5导航栏方案

    背景 在移动端页面中,由于屏幕空间有限,导航条扮演着非常重要的角色,提供了快速导航到不同页面或功能的方式.用户也通常会在导航条中寻找他们感兴趣的内容,因此导航条的曝光率较高.在这样的背景下,提供一个动 ...

  8. Blazor前后端框架Known-V1.2.14

    V1.2.14 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Git ...

  9. DevOps |研发效能之环境、程序、配置、SQL变更管理

    本文主要是讲如何建立有效的环境.程序.配置.SQL变更和管理平台. ​几天前和一个朋友聊到环境.程序的配置变更,SQL变更和整个上线流程.之前我们在这块也做了很多,有做的好的也有做的一般的,借机都总结 ...

  10. 使用KRPano资源分析工具强力加密JS文件

    本文地址:http://www.cnblogs.com/reachteam/p/6294767.html 软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278 ...