栈的应用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语言实现逆波兰式)
一.前言 普通人在书写计算式时会选择中缀表达式,这样符合人脑的认知习惯.可计算机处理时后缀表达式才能使处理速度更快,其原因是利用堆栈结构减少计算机内存访问.同时它也是一个很好锻炼栈这个数据结构的应 ...
随机推荐
- php yii框架使用MongoDb
1.安装 运行 php composer.phar require --prefer-dist yiisoft/yii2-mongodb or add "yiisoft/yii2-mongo ...
- poj 2184 Cow Exhibition
// 给定n头牛,每头有属性智商和幽默感,这两个属性值有正有负,现在要从这n头牛中选出若干头使得他们的智商和与幽默感和不为负数,// 并且两者两家和最大,如果无解输出0,n<=100,-1000 ...
- getDeclaredMethods()和getMethods()区别
getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共.保护.默认(包)访问和私有方法, ...
- RecordWriter接口解析
RecordWriter是将Map/Reduce结果(Key-Value)输出到文件系统中. /** * <code>RecordWriter</code> writes th ...
- IDEA与Tomcat创建并运行Java Web项目及servlet的简单实现
创建Web项目 1. File -> New Project ,进入创建项目窗口 2.在 WEB-INF 目录下点击右键, New -> Directory ,创建 classes 和 ...
- java web 学习三(Tomcat 服务器学习和使用2)
一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:
- IT版孔乙己(转)
[不要做学究]回忆孔先生IT版 我关于本文评价:看到这篇文章很多人会生出这样的疑问“这明明是在诋毁钻研技术的人嘛?是不是在宣扬技术无用论?”. 初看这篇文章的时候我也是这样的想法,但是逐步才明白这篇文 ...
- 两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]…*a[N-1]/a[i];
转自:http://blog.csdn.net/shandianling/article/details/8785269 问题描述:两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i ...
- Delphi 利用TComm组件 Spcomm 实现串行通信
Delphi 利用TComm组件 Spcomm 实现串行通信 摘要:利用Delphi开发工业控制系统软件成为越来越多的开发人员的选择,而串口通信是这个过程中必须解决的问题之一.本文在对几种常用串口通信 ...
- Chromuim开发机配置
一个出色的程序员需要一台给力的电脑. 之前使用ThinkPad R400笔记本编译Chromium,确实太痛苦了,第一次编译未使用SSD,超过了24小时都没有编译完.后来断断续续折腾了将近一个月才编译 ...