输入中缀表达式输出结果(结果可以是小数,但输入必须是整数) 

 #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. 栈的应用1——超级计算器(中缀与后缀表达式)C语言

    这里要学的程序主要用来实现一个功能——输入表达式输出结果,也就是一个计算器.效果如下: 这个程序主要有两个步骤:1.把中缀表达式转换为后缀表达式:2.计算后缀表达式的结果. 首先先明白几个问题: 1. ...

  2. C++ 使用栈求解中缀、后缀表达式的值

    1. 前言 表达式求值对于有知识积累的你而言,可以通过认知,按运算符的优先级进行先后运算. 但对计算机而言,表达式仅是一串普通的信息而已,需要通过编码的方式告诉计算机运算法则,这个过程中栈起到了至关重 ...

  3. 前缀、中缀、后缀表达式及其相互转化的Java实现

    一.中缀表达式转换为前缀.后缀表达式 给个中缀表达式:a+b*c-(d+e)    首先根据运算符的优先级给所有运算单位加括号:((a+(b*c))-(d+e))    将运算符号移动到对应括号的前面 ...

  4. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  5. C++ 中缀转后缀表达式并求值

    //中缀转后缀 #include<iostream> #include<stack> using namespace std; int prio(char x){ ; ; ; ...

  6. Java数据结构和算法(六):前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  7. 数据结构之栈—强大的四则复杂运算计算器(超过windows自带的科学计算器)【中缀转后缀表达式】

    比windows自带计算器还强的四则复杂运算计算器! 实测随机打出两组复杂算式:-7.5 * 6 / ( -2 + ( -6.5 -  -5.22 ) )与7.5+-3*8/(7+2) windows ...

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

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

  9. 前缀、中缀、后缀表达式以及简单计算器的C++实现

    前缀表达式(波兰表达式).中缀表达式.后缀表达式(逆波兰表达式) 介绍 三种表达式都是四则运算的表达方式,用以四则运算表达式求值,即数学表达式的求解. 前缀表达式 前缀表达式是一种没有括号的算术表达式 ...

  10. 栈的简单应用之中缀表达式转后缀表达式(C语言实现逆波兰式)

    一.前言   普通人在书写计算式时会选择中缀表达式,这样符合人脑的认知习惯.可计算机处理时后缀表达式才能使处理速度更快,其原因是利用堆栈结构减少计算机内存访问.同时它也是一个很好锻炼栈这个数据结构的应 ...

随机推荐

  1. Java Web编程的主要组件技术——JSP

    参考书籍:<J2EE开源编程精要15讲> JSP(Java Server Page)页面由HTML代码和嵌入其中的Java代码组成. 简单的JSP页面如: <html> < ...

  2. Builder模式在Java中的应用(转)

    在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...

  3. Java [Leetcode 219]Contains Duplicate II

    题目描述: Given an array of integers and an integer k, find out whether there are two distinct indices i ...

  4. Java [Leetcode 118]Pascal's Triangle

    题目描述: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5 ...

  5. Java [Leetcode 169]Majority Element

    题目描述: Given an array of size n, find the majority element. The majority element is the element that ...

  6. directdraw的多画面显示rgb

    // showpicDlg.cpp : 实现文件 // #include "stdafx.h" #include "showpic.h" #include &q ...

  7. liunx上运行mybase

    mybase 是个人知识管理软件,国内用他的人很多,尤其是程序员.我也是mybase的忠实使用者,有大量的积累.    以前一直用Windows,mybase使用完全没有问题,后来转投ubuntu阵营 ...

  8. 【DFS+堆的二叉树结构】15轻院校赛-J-堆

    [题目链接:J-堆] 1734: 堆 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 239  Solved: 113 SubmitStatusWeb B ...

  9. 屏蔽页面js报的错误

    有时候,某些js的错误,确实没有什么大影响,但是这个又实在没办法. 一般,下下策采取 <script language="javascript"> function k ...

  10. Xcode中使用svn时,报证书验证错误Error validating server certificate for

    转:http://blog.csdn.net/yhawaii/article/details/7511141 今天使用Xcode自带的svn客户端时,总是连接不上服务器,报如下错误: Error va ...