栈的应用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语言实现逆波兰式)
一.前言 普通人在书写计算式时会选择中缀表达式,这样符合人脑的认知习惯.可计算机处理时后缀表达式才能使处理速度更快,其原因是利用堆栈结构减少计算机内存访问.同时它也是一个很好锻炼栈这个数据结构的应 ...
随机推荐
- python模拟http请求
下文主要讲述如何利用python自带的库模拟http请求,为以后利用python做API测试做准备. 只讲述模拟http的过程,具体到自己用的时候,要以自己的应用为准做出适当的调整. #!coding ...
- (转)c & c++内存分配
一.预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于 数据结构中的栈. ...
- 最简单的视音频播放示例4:Direct3D播放RGB(通过Texture)
本文接着上一篇文章继续记录Direct3D(简称D3D)播放视频的技术.上一篇文章中已经记录了使用Direct3D中的Surface渲染视频的技术.本文记录一种稍微复杂但是更加灵活的渲染视频的方式:使 ...
- VS2010开发2dx无法解析的外部符号解决记录
首先新建HelloWorld项目... 想使用Cocos2d扩展包需要引入相关头文件,如:#include “cocos-ext.h”...接下来我们右键工程属性->配置属性->c/c++ ...
- handler.post 为什么要将thread对象post到handler中执行呢?
转载网址:http://www.cnblogs.com/crazypebble/archive/2011/03/23/1991829.html在Android中使用Handler和Thread线程执行 ...
- java web 学习九(通过servlet生成验证码图片)
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:
- 《C++ primer》--第9章
习题9.2 创建和初始化一个vector对象有4种方式,为每种方式提供一个例子. 解答: 分配指定数目的元素,并对这些元素进行值初始化: vector<int> ivec(10); ...
- WEB安全性测试测试用例(基础)
建立整体的威胁模型,测试溢出漏洞.信息泄漏.错误处理.SQL 注入.身份验证和授权错误. 输入验证 客户端验证服务器端验证(禁用脚本调试,禁用Cookies) 1.输入很大的数(如4,294,967, ...
- 个人经验 - Android的RelativeLayout布局的layout_height属性设置为wrap_content时的坑
Android的RelativeLayout布局的layout_height属性设置为wrap_content时的坑: 此坑出现的条件: 1.RelativeLayout布局的layout_heigh ...
- 总结:ADO.NET在开发中的部分使用方法和技巧
如何使用 SqlDataAdapter 来检索多个行 以下代码阐明了如何使用 SqlDataAdapter 对象发出可生成 DataSet 或 DataTable 的命令.它从 SQL Server ...