栈的应用2——超级计算器(中缀与后缀表达式)C语言
输入中缀表达式输出结果(结果可以是小数,但输入必须是整数)
#include<stdio.h>
#include<stdlib.h> //需要两个栈,一个储存结果,一个储存运算符
#define newpc (stype *)malloc(sizeof(stype))
#define newpi (inttype *)malloc(sizeof(inttype)) //定义两个申请地址的宏
typedef struct char_stack
{
char dat;
struct _stack * next;
} stype;
typedef struct int_stack
{
double dat;
struct _stack * next; //建立两个栈类型
} inttype;
void charpush(stype** stacktop,char c) //运算符压栈函数,需要传进栈顶指针本身的地址,而不是它指向的地址
{
stype * ss=newpc;
ss->dat=c;
ss->next=*stacktop;
*stacktop=ss;
}
char charpop(stype** stacktop) //运算符出栈函数
{
char c=(*stacktop)->dat;
stype *ss=(*stacktop);
(*stacktop)=(*stacktop)->next;
free(ss);
return c;
}
void intpush(inttype** stacktop,double c) //数字压栈函数
{
inttype * ss=newpi;
ss->dat=c;
ss->next=*stacktop;
*stacktop=ss;
}
double intpop(inttype** stacktop) //数字出栈函数
{
double c=(*stacktop)->dat;
inttype *ss=(*stacktop);
(*stacktop)=(*stacktop)->next;
free(ss);
return c;
}
void tanchu(char c,inttype ** stacktop) //弹出字符,然后运算,然后进栈
{
double a=intpop(stacktop);
double b=intpop(stacktop);
if (c=='+') intpush(stacktop,b+a);
else if (c=='-') intpush(stacktop,b-a);
else if (c=='*') intpush(stacktop,b*a);
else if (c=='/') intpush(stacktop,b/a);
}
int tance(char c) //探测优先级的函数
{
if (c=='+'||c=='-') return ;
else if (c=='*'||c=='/') return ;
else if (c=='@'||c=='('||c==')') return -;
}
int main() //主函数 功能:处理输入的中缀表达式,输出结果(过程中用到了后缀的转化)
{
stype * sig,* sigtop;
inttype * num,* numtop; //每个栈需要两个指针进行操作
char c=getchar();
sig=newpc;
sig->dat='@';
sig->next=NULL;
sigtop=sig;
num=newpi;
num->next=NULL;
numtop=num; //初始化两个栈
while (c!='\n') //一直读入,直至读到回车符结束
{
//接下来要对读入的当前字符进行处理
if (c>=''&&c<='')
{
int a=c-;
c=getchar();
while(c>=''&&c<='')
{
a=a*+(c-);
c=getchar();
}
intpush(&numtop,a); //如果是个数字字符,就把这个数字一直读进去(因为不一定是几位数),然后压栈到num里
}
else if (c=='(') //如果是左括号,直接压栈到sig里
{
charpush(&sigtop,'(');
c=getchar();
}
else if (c==')') //如果是右括号,就边弹栈边处理结果,直到遇到左括号
{
while (sigtop->dat!='(')
{
tanchu(charpop(&sigtop),&numtop);
}
c=getchar();
charpop(&sigtop);
}
else if (c=='+'||c=='-'||c=='*'||c=='/') //如果是+-*/就比较与栈顶的优先级,如果高,直接压入,否则(等于也不能压入),边弹边处理结果,直到可以压入(和上面有点像)
{
int j=tance(c);
int k=tance(sigtop->dat);
if (j>k)
{
charpush(&sigtop,c);
c=getchar();
}
else{
while(j<=k)
{
tanchu(charpop(&sigtop),&numtop);
k=tance(sigtop->dat);
}
charpush(&sigtop,c);
c=getchar();
}
}
else //否则,忽略这个符号 ,并且显示输入有误
{
c='\n';
printf("输入有误\n");
} }
while (sigtop->dat!='@') //收收尾,把没有弹出的都处理一下
{
tanchu(charpop(&sigtop),&numtop);
}
printf("%.2lf\n",numtop->dat);
c=getchar();
return ;
}
栈的应用2——超级计算器(中缀与后缀表达式)C语言的更多相关文章
- 栈的应用1——超级计算器(中缀与后缀表达式)C语言
这里要学的程序主要用来实现一个功能——输入表达式输出结果,也就是一个计算器.效果如下: 这个程序主要有两个步骤:1.把中缀表达式转换为后缀表达式:2.计算后缀表达式的结果. 首先先明白几个问题: 1. ...
- C++ 使用栈求解中缀、后缀表达式的值
1. 前言 表达式求值对于有知识积累的你而言,可以通过认知,按运算符的优先级进行先后运算. 但对计算机而言,表达式仅是一串普通的信息而已,需要通过编码的方式告诉计算机运算法则,这个过程中栈起到了至关重 ...
- 前缀、中缀、后缀表达式及其相互转化的Java实现
一.中缀表达式转换为前缀.后缀表达式 给个中缀表达式:a+b*c-(d+e) 首先根据运算符的优先级给所有运算单位加括号:((a+(b*c))-(d+e)) 将运算符号移动到对应括号的前面 ...
- Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- C++ 中缀转后缀表达式并求值
//中缀转后缀 #include<iostream> #include<stack> using namespace std; int prio(char x){ ; ; ; ...
- Java数据结构和算法(六):前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- 数据结构之栈—强大的四则复杂运算计算器(超过windows自带的科学计算器)【中缀转后缀表达式】
比windows自带计算器还强的四则复杂运算计算器! 实测随机打出两组复杂算式:-7.5 * 6 / ( -2 + ( -6.5 - -5.22 ) )与7.5+-3*8/(7+2) windows ...
- 6, java数据结构和算法: 栈的应用, 逆波兰计算器, 中缀表达式--> 后缀表达式
直接上代码: public class PolandCalculator { //栈的应用:波兰计算器: 即: 输入一个字符串,来计算结果, 比如 1+((2+3)×4)-5 结果为16 public ...
- 前缀、中缀、后缀表达式以及简单计算器的C++实现
前缀表达式(波兰表达式).中缀表达式.后缀表达式(逆波兰表达式) 介绍 三种表达式都是四则运算的表达方式,用以四则运算表达式求值,即数学表达式的求解. 前缀表达式 前缀表达式是一种没有括号的算术表达式 ...
- 栈的简单应用之中缀表达式转后缀表达式(C语言实现逆波兰式)
一.前言 普通人在书写计算式时会选择中缀表达式,这样符合人脑的认知习惯.可计算机处理时后缀表达式才能使处理速度更快,其原因是利用堆栈结构减少计算机内存访问.同时它也是一个很好锻炼栈这个数据结构的应 ...
随机推荐
- temp - Linux administration handbook 答案
我开始做第一章后的练习题,发觉不是很容易随意地回答,就像是C++ primer之后的练习题的感觉. 自己有这么多不会的,让我感觉很不爽啊- -! 先不要要求自己一下子都明了,一口吃不成胖子,先找一份工 ...
- 省常中模拟 Test3 Day1
tile 贪心 题意:给出一个矩形,用不同字母代表的正方形填充,要求相邻的方块字母不能相同,求字典序(将所有行拼接起来)最小的方案. 初步解法:一开始没怎么想,以为策略是每次填充一个尽量大的正方形.但 ...
- 数据库语言(三):MySQL、PostgreSQL、JDBC
MySQL MySQL资料很多,这里只给出一个在论坛博客中最常用的操作:分页 mysql> select pname from product limit 10,20; limit的第一个参数是 ...
- poj 2762 Going from u to v or from v to u?
题目描述:为了让他们的儿子变得更勇敢些,Jiajia和Wind将他们带到一个大洞穴中.洞穴中有n个房间,有一些单向的通道连接某些房间.每次,Wind选择两个房间x和y,要求他们的一个儿子从一个房间走到 ...
- Ajax+PHP简单入门教程
Ajax 由 HTML.JavaScript™ 技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序.对于Ajax,最核心的一个对象是XMLH ...
- Cake slicing
题意: n*m的方格中有k个点,现在要把方格分开使得每个点在一个部分,每分一次花费边长的费用,求完成花的最小费用 分析: dp[sx][sy][ex][ey]表示分割起点(sx,sy)终点(ex,ey ...
- Multiple View Geometry in Computer Vision Second Edition by Richard Hartley 读书笔记(二)
// Chapter 2介绍的是2d下的投影变换,摘录下了以下定理 Result 2.1. The point x lies on the line l if and only if xTl = 0. ...
- 从零开始完整Electron桌面开发(1)搭建开发环境
[OTC] # 需要知识 1. 简单的html.javascript.css知识,就是web前端入门知识. 2. 简单命令行的应用,不会也没关系,照着代码敲就行. 3. 下载安装就不说了吧. 4. 本 ...
- 圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point
// 圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point // 思路:直接暴力绝对T // 先确定x范围,每个x范围内,离圆心最远的点一定是y轴两端的点.枚举x的范围,再 ...
- commons-lang3-3.4.jar
StringUtils 1.StringUtils.isBlank(str); 检查字符串是否为空白(“ ”),为空(“”),为null. * StringUtils.isBlank(null) ...