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. 基础版本:用KNN算法实现预测facebook签到位置模型的训练(内含数据集下载)

    实现模型的训练一般的流程便是 # 导包 # 导入数据 # 数据处理 # 特征工程 # KNN算法预估流程 # 模型评估 接下来便实现以上流程 实现该模型训练我们需要导入一下的函数 1 # 导包 2 3 ...

  2. openlayers学习笔记

    https://www.cnblogs.com/suRimn/p/10649816.html

  3. 【go笔记】使用sqlx操作MySQL

    前言 go在操作MySQL时,可以使用ORM(比如gorm.xorm),也可以使用原生sql.本文以使用sqlx为例,简单记录步骤. go version: 1.16 安装相关库 # mysql驱动 ...

  4. nlp入门(三)基于贝叶斯算法的拼写错误检测器

    源码请到:自然语言处理练习: 学习自然语言处理时候写的一些代码 (gitee.com) 数据来源:norvig.com/big.txt 贝叶斯原理可看这里:机器学习算法学习笔记 - 过客匆匆,沉沉浮浮 ...

  5. 两种方式,轻松实现ChatGPT联网

    两种方式效果: 方式一:浏览器搜索内嵌插件 方式二:官方聊天页内嵌插件 首先,要有一个谷歌浏览器,然后再安装一个叫ChatGPT for Google,直接在谷歌里搜一下就能找,也可以Chrome应用 ...

  6. SQL简单使用指南

    SQL简单使用指南 SQL(结构化查询语言)是一种用于管理和操作关系型数据库的标准化语言. 数据库概述 数据库是用于存储和组织数据的结构.它由表(表格)组成,每个表都包含多个列和行.以下是SQL中最常 ...

  7. hihocoder 1290 DP

    题目利用DP思想,dp[i][j][k]表示robot跑到i行j列目前移动方向为k时,所需要的最小的flip.其中0 <= i <= N,0 <= j <= M,k = rig ...

  8. 从零开始FastDFS整合Nginx(转)

    转自 https://www.cnblogs.com/chiangchou/p/fastdfs.html#_labelTop Linux环境:Centos7.0   安装过程 原博客有几处纰漏,下文已 ...

  9. fmt 库简介和示例【GO 基础】

    〇.关于 fmt fmt 标准库是 Go 语言标准库的一部分,提供了格式化字符串.输入输出等基本功能.通过 fmt 库,我们可以进行简单的格式化输出.读取用户输入.错误输出等操作. fmt 库实现了类 ...

  10. PHPStudy hosts文件可能不存在或被阻止打开及同步hosts失败问题

    在使用PHPStudy建站包时,有时会遇到同步hosts失败的问题,可能是因为hosts文件不存在或被阻止打开.这个问题通常可以通过以下几个步骤解决: 步骤一:检查hosts文件是否存在 首先,我们需 ...