数据结构用栈实现算术表达式的求值运算

小白一枚,最近用栈实现算术表达式的求值运算结果出现好多问题,单独的加减乘除运算都能够实现,但一旦加上括号运算就停在那命令窗口也不能输入信息,跪求大神指点原因
附上代码和截图:图片说明
#include
#include
#include
#define STACK_INIT_SIZE 100 //存储空间初始分配量;
#define S 10 //存储空间分配增量;
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef struct{
char base;
char *top;
int stacksize;
}sqstack; //定义运算符类型栈;
typedef struct{
int *base;
int *top;
int stacksize;
}stack; //定义运算数栈;
void InitStack(sqstack &OPTR) //构建运算符栈;
{
OPTR.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!OPTR.base)
printf("Error!\n");
OPTR.top=OPTR.base;
OPTR.stacksize=STACK_INIT_SIZE;
return;
}
void Initstack(stack &OPND) //构建运算数栈;
{
OPND.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!OPND.base)
printf("ERror!");
OPND.top=OPND.base;
OPND.stacksize=STACK_INIT_SIZE;
return;
}
int In(char ch) //判断字符是否是运算符;
{
int r;
switch(ch)
{
case '+':
case '-':
case '
':
case '/':
case '#':r=1;break;
default:r=0;break;
}
return r;
}
void PuSh(sqstack &OPTR,char ch) //运算符栈插入新的运算符栈顶元素;
{
if(OPTR.top-OPTR.base>=OPTR.stacksize) //栈满,追加存储空间;
{
OPTR.base=(char )realloc(OPTR.base,(OPTR.stacksize+S)*sizeof(char));
if(!OPTR.base)
printf("错误!");
OPTR.top=OPTR.base+OPTR.stacksize;
OPTR.stacksize+=S;
}
*OPTR.top++=ch;
printf("成功插入(puSh)运算符栈顶元素!\n");
}
void PoP(sqstack &OPTR,char &ch) //删除字符的栈顶元素;(!!!!!!!!!!!!!!)
{
if(OPTR.top==OPTR.base)
printf("error");
ch=
--OPTR.top;
printf("删除字符栈顶元素!\n");
}
char GetTop(sqstack &OPTR) //得到运算符栈顶元素;(!!!!!!!!!!!!!)
{
char c;
if(OPTR.top==OPTR.base)
printf("error!");
c=*(OPTR.top-1);

printf("运算符栈顶元素正常\n");
return c;

}
void Push(stack &OPND,int e) //运算数栈插入新的运算数栈顶元素;
{
if(OPND.top-OPND.base>=OPND.stacksize) //栈满,追加空间;
{ OPND.base=(int )realloc(OPND.base,(OPND.stacksize+S)*sizeof(int));
if(!OPND.base)
printf("运算数栈错误!");
OPND.top=OPND.base+OPND.stacksize;
OPND.stacksize+=S;
}
*OPND.top++=e;
printf("成功插入运算数栈!\n");
}
void Pop(stack &OPND,int &e) //删除运算数栈的栈顶元素;(!!!!!!!!!!!!!!!)
{
if(OPND.top==OPND.base)
printf("error");

e=
--OPND.top;
printf("成功删除运算数栈!");
}
int Gettop(stack &OPND) //得到运算数栈顶元素;(!!!!!!!!!!!!!!!!!!)
{
int a;
if(OPND.top==OPND.base)
return 0;
else
a=*(OPND.top-1);
return a;
}
char compare(char a,char b) //判断运算符的优先级;
{
int i,j;
int array[7][7]= //1表示">",-1表示"<",0表示"=",2表示不可能
{
{1,1,-1,-1,-1,1,1},
{1,1,-1,-1,-1,1,1},
{1,1,1,1,-1,1,1},
{1,1,1,1,-1,1,1},
{-1,-1,-1,-1,-1,0,2},
{1,1,1,1,2,1,1},
{-1,-1,-1,-1,-1,2,0}
};
switch(a)
{
case '+':i=0;break;
case '-':i=1;break;
case '*':i=2;break;
case '/':i=3;break;
case '(':i=4;break;
case ')':i=5;break;
case '#':i=6;break;
}
switch(b)
{
case '+':j=0;break;
case '-':j=1;break;
case '*':j=2;break;
case '/':j=3;break;
case '(':j=4;break;
case ')':j=5;break;
case '#':j=6;break;
}
if(array[i][j]==1)
return '>';
else if(array[i][j]==-1)
return '<';
else if(array[i][j]==0)
return '=';
else printf("error!");
printf("该函数被调用");
return 1;

}
int operate(int p,char f,int q)
{
switch(f)
{
case '+':return p+q;
case '-':return p-q;
case '*':return p*q;
case '/':return p/q;
}
return 1;
}
int EvaluateExpression()
{
char c,f, d[100],e;
int i, num, tmpa, tmpb;
sqstack OPTR;
stack OPND;
InitStack(OPTR);Initstack(OPND);
PuSh(OPTR,'#');
c=getchar();
while(c!='#'||(e=GetTop(OPTR))!='#')
{
if(c>='0'&&c<='9')
{
i=0;
do{
d[i++]=c;
c=getchar();
}while(c>='0'&&c<='9');
d[i]='\0';
num=atoi(d);
Push(OPND, num);
}
else if(In(c))
{
switch(compare(GetTop(OPTR), c))
{
case '<': PuSh(OPTR, c);c=getchar();
break;
case '=': PoP(OPTR, f);c=getchar();
break;
case '>': PoP(OPTR, f);Pop(OPND, tmpb);Pop(OPND, tmpa);
Push(OPND, operate(tmpa, f, tmpb));
break;
}
}
}
return Gettop(OPND);
}
int EvaluateExpression(); //主操作函数
void main()
{
int r;
printf("请输入表达式:");
r=EvaluateExpression();
printf("输出结果为:%d\n",r);
}

0

2个回答

你有没有学数据结构啊 可以看看数据结构的书 可以把表达式转换成后置表达式然后计算 很方便的

0

出入栈的限制条件把对括号的匹配也做成一个条件判断比较好。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
数据结构——算术表达式求值(顺序栈的实现)
数据结构——算术表达式求值(顺序栈的实现)rn//算术表达式 (顺序栈的实现) rnrnrn#include&amp;amp;lt;stdio.h&amp;amp;gt;rn#include&amp;amp;lt;malloc.h&amp;amp;gt;rn#include&amp;amp;lt;stdlib.h&amp;amp;gt;rn#include&amp;amp;lt;string.h&amp;amp;gt;rnrnrn#define OK 1rn#define ERROR 0rn#define
数据结构 栈的应用——算术表达式求值
实验目的 :rn1rn.掌握栈的定义及实现;rn2rn.掌握利用栈求解算术表达式的方法。rn实验内容:rn通过修改完善教材中的算法3.4,利用栈来实现算术表达式求值的算法。对算法3.4中调用的几个函数要给出其实现过程:rn(1) rn函数In(c):判断c是否为运算符;rn(2) rn函数Precede(t1,t2):判断运算符t1和t2的优先级;rn(3) rn函数Operate(a,theta
数据结构实验十 利用栈实现算术表达式的求值
[问题描述] n利用栈实现算术表达式的求值。可以简单一些,假设表达式中含有一位整数,以及+、-、*、/、(、)。但不受此限制。(难易程度:中) n[实验目的] n1、掌握栈的应用。 n2、掌握算符优先表达式求值的算法。 n3、掌握字符串处理和数值的转换。 n[实验内容及要求] n1、表达式以字符串形式输入,并以‘#’开始和结束(‘#’也作为算法来处理)。如输入:#6+3*(9-7)-8/2# n...
数据结构第二次作业(表达式求值【栈模拟】)
实验题目:栈的应用-算术表达式求值                                         n实验目的 :n1n.掌握栈的定义及实现;n2n.掌握利用栈求解算术表达式的方法。n实验内容:n通过修改完善教材中的算法3.4,利用栈来实现算术表达式求值的算法。对算法3.4中调用的几个函数要给出其实现过程:n(1)
利用栈实现算术表达式求值(Java语言描述)
算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识。声明:部分代码参考自茫茫大海的专栏。rnrn链栈的实现:rnrnrnrnpackage 算数表达式求值;  rn  rnpublic class Stack {  rn    //节点类  rn    public class Node{  rn        public T data;  rn  
算术表达式求值-中缀表达式(栈实现)-Java
中缀表达式是我们最常见的算术表达式,在人类看来比较直观,而用机器实现有点复杂。这里的方法利用两个栈,一个用来放数字numStack,一个用来放符号opStack。nn具体步骤如下: n从左到右扫描表达式 n1.扫描到数值,把数值压入数字栈numStack。nn2.扫描到数学符号 n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.1扫描到加减号‘+’,‘-’,符号栈里的符号一个个出栈,同时出一个...
栈的应用之算术表达式求值
栈是一种后进先出的数据结构。表达式求值是对栈的一个典型的应用。 n对于如下一个表达式: 1 + 2 * (3 + 4)n此算术表达式由一些操作符和操作数组成。其中,操作符有‘+’、‘*’、‘(’等,操作数有‘1’、‘2’、‘3’等。对于操作符来说,其运算是有优先级的。比如,上述表达式中,3+4应该先进行操作,将得到的结果再与2相乘。算符间的优先关系如下:n 运算符n +n -n *
基于栈结构的中缀表达式求值实验报告
基于栈结构的中缀表达式求值 用c语言详细的叙述了如何求栈结构的中缀表达式的值
数据结构基于栈的算术表达式求值算法
对算法中调用的几个函数要给出其实现过程: (1) 函数In(c):判断c是否为运算符; (2) 函数Precede(t1,t2):判断运算符t1和t2的优先级; (3) 函数Operate(a,theta,b):对a和b进行二元运算theta。
数据结构之——用C++实现算术表达式求值
基本功能:利用栈实现整数的加减乘除运算。rn使用方法:输入表达式之后再输入#表示表达式结束,如下图:rnrnrn缺点:不能进行小数的运算rnrnrn代码如下:rn#include n#include n#include nusing namespace std;nn#define MAXNUM 50nnnclass Stack_for_numbern{n private:n float num[M
数据结构例程——表达式求值(用栈结构)
本文针对数据结构基础系列网络课程(3):栈和队列中第5课时栈的应用1-表达式求值。例:用户输入一个包含“+”、“-”、“*”、“/”、正整数和圆括号的合法数学表达式,计算该表达式的运算结果。 n解答:#include <stdio.h>n#include <stdlib.h>n#define MaxOp 100n#define MaxSize 100nstruct //设定运算符优先级n{
算术表达式求值(栈的应用)
算术表达式求值的难点nnnn运算符有优先规则nn对于一般的算术表达式a*b+(c-d/e)*f来说,如果要对它求值,在计算机取到×的时候,不能直接运算,需要继续往后取值,找是否有比×运算级高的符号,没有的话才能运算。nnnn运算符的操作数是否能直接操作nn而且还不能保证它的两个操作数都是可以直接操作的,比如针对上式的+来说,它的两个操作数a*b和(c-d/e)*f是不能直接操作的,需要进一步计算a...
数据结构(6)--栈的应用之中缀表达式求值
参考书籍:数据结构(C语言版) 严蔚敏 吴伟民编著 清华大学出版社nn本文中的代码可从这里下载:https://github.com/qingyujean/data-structurenn1.简要说明nn分析:设操作符栈op栈 操作数栈num栈nop栈里不可能出现')',只可能有'+'、'-'、'*'、'/'、'(',设ch为当前字符,假设输入都是合法的n 1.ch为'+'、'-',则...
双栈算术表达式求值算法
双栈算术表达式求值算法nnnn栈 n栈是一种基于先进后出策略(LIFO)的集合类型。nn算术表达式 n例如 ( 1 + ( 5 - 2 ) * ( 6 + 3 ) )nn算法要求描述 n要求输入算术表达式字符串,每个字符和数字之间用 空格(space) 间隔开, 程序输出 表达式的值。(简单起见,暂且仅实现 加减乘除,并且不省略括号 )nn思路nnn首先我们需要两个栈:operator(用于存放...
算法 -- 双栈算术表达式求值算法
算法 – 双栈算术表达式求值算法最近在学习算法时候,看到一个双栈算术表达式求值算法,挺启发我的;平常大家在写代码的时候要写表达式的时候,基本都是直接 (1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) );这样程序会帮你的自动计算出结果,大家有没用想过这程序是如何一步一步计算并得出你需要的值,今天讲一个简单例子,可以帮助大家很好的了解双栈算术表达式求值算法是什么。 n首先,为了简单化的解释
表达式求值(采用栈实现)
利用栈实现算术表达式的求值,表达式中可包含加+、减(负) -、乘*、除/、 乘方^、括号( )运算符,操作数可以为浮点数。 可采用直接求中缀表达式的方法, 也可采用先转换成后缀表达式后再求值的方法(参看课件) 。 实现时需注意如下: ( 1)带小数点的数值生成 ( 理解整数数值的生成,小数部分的处理与之类似)。 ( 2)考虑负号的情况。负号与减号形式上一样,如何区分? • 输入的表达式串中第 1 个字符是’-’ – 可断定此’-’是负号 • 其余的’-’ – 若紧接在’(’之后的’-’可断定是负号 ( 3)负号的处理 • 方法 1:若已断定是负号,可先压入数值 0 进入操作数栈,如此,可 将负号看作减号。 • 方法 2: 若已断定是负号,则紧接其后的数字字符转换成数值后,要 将其对应的相反数(负数)压入操作数栈
数据结构之简单四则运算表达式求值8-(栈的实现)
利用栈实现简单的四则运算,有待提升的地方有,不支持负数的运算,只支持0-9之间数值的计算rn代码如下rn#include n#include n#include nnusing namespace std;nnvoid InfixToPostfix(string &str1, string &str2, stack &s)n{n char ch, temp;n for (size_t i = 0;
【数据结构】栈实现表达式求值
用栈实现表达式求值,涉及到中、后缀表达式转换的问题。nnExpression.hnn/*****************n* Calc_Expression()n* 功能: 利用栈实现整数表达式求值n* 输入: 表达式字符串n* 输出: 求值结果n* 作者: wudi_Xn* 日期: 2018-04-05n*******************/n#ifndef EXPRESSION_H_n#de...
【数据结构】栈的运用(一)无括号表达式求值
无符号表达式求值rn- 利用栈的特性进行表达式计算。rn- 主要思路是做一个数字栈和一个符号栈,分别存放数字和运算符。rn- 利用入栈的运算符和栈内运算符相比较优先级达到计算目的。
设计一个程序,演示用算符优先法对算术表达式求值的过程
表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。 基本要求:以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。利用教科书表3.1给出的算符优先关系,实现对算术四则混合运算表达式的求值,并仿照教科书的例3-1演示在求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。 测试数据:3*(7-2);8;1+2+3+4;(((6+6)*6+3)*2+6)*2;(20+2)*(6/2);
(数据结构实验)栈的应用-算术表达式求值
实验目的:nn1.掌握栈的定义及实现;nn2.掌握利用栈求解算术表达式的方法。nn nn实验内容:nn通过修改完善教材中的算法3.22,利用栈来实现算术表达式求值的算法。nn对算法3.22中调用的几个函数要给出其实现过程:nn(1) 函数In(c):判断c是否为运算符;nn(2) 函数Precede(t1,t2):判断运算符t1和t2的优先级;nn(3) 函数Operate(a,theta,b):...
数据结构实验——表达式求值(个位数扩充为多位数)
思路:对于输入字符串的处理,增加判断是否有连续的多个数字。nn#include&amp;lt;iostream&amp;gt;n#include&amp;lt;string&amp;gt;n#include&amp;lt;stdlib.h&amp;gt;nusing namespace std;nconst char oper[7] = { '+', '-', '*', '/', '(', ')', '#' };n#define OK 1n#d...
【数据结构 - 栈的应用】四则运算表达式求值 java实现
小白进阶 之 数据结构 - 栈nn最近在看数据结构,其中栈的应用中有一个关于四则运算表达式求值。觉得有点意思,所以实现并记录之。nn20世纪50年代,波兰逻辑学家Jan Łukasiewicz想到了一种不需要括号的后缀表达法,即逆波兰(Reverse Polish Notation)表示,这一表示方式,巧妙地解决了程序实现四则运算的难题[1]。nn【问题】对一标准的四则运算表达式进行运算求值。nn...
栈的测试--四则运算表达式求值(C语言)
通过学习《大话数据结构》,练习对栈的使用,此测试是四则运算表达式求值。
数据结构实验——用栈实现表达式的计算(C语言)
1.实验内容n设计一个程序,演示用算符优先法对算术表达式求值的过程。以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。n2.实验思路nn算法:nn3.代码(配套教材严蔚敏版)nn#include&amp;lt;stdio.h&amp;gt;n#include&amp;lt;malloc.h&amp;gt;n#include&amp;lt;stdlib.h&amp;gt;n#include&amp;lt;string.h&amp;gt;n#define...
【数据结构】栈的应用---四则运算表达式求值(中缀表达式与后缀表达式转换)
用计算机实现带括号的四则运算的方式。这里的困难在于乘除运算的优先级高于加减运算,并且加入了括号,使得问题变得更加困难。20世纪50年代,波兰逻辑学家想到了一种不需要括号的后缀表达法,我们也把它称为逆波兰表示。比如:9+(3-1)*3+10/2,如果用后缀表示法就是9 3 1 - 3 * + 10 2 / +,这样的表达式称为后缀表达式,叫后缀的原因在于所有的符号都是要在运算数字的后面出现。后缀表达式
《利用栈实现含浮点数的算术表达式的计算》
 nn1、基本思路:nn先将算术表达式(中缀式)读入到string对象中,再将其经过相关操作解析并转换成后缀表达式(存放在一条链表中),最后才(遍历该链表)对该表达式进行运算。2、如何支持浮点数的运算:a、使用atof()函数,它是C语言标准库中的一个字符串处理函数,功能是把字符串转换成浮点数,其头文件为&amp;lt;stdlib.h&amp;gt;,该函数名是 &quot;ASCII to floating point...
利用栈实现算术表达式的求值
[问题描述]n利用栈实现算术表达式的求值。可以简单一些,假设表达式中含有一位整数,以及+、-、*、/、(、)。但不受此限制。(难易程度:中)n[实验内容及要求]n1、表达式以字符串形式输入,并以‘#’开始和结束(‘#’也作为算法来处理)。如输入:#6+3*(9-7)-8/2#n2、能够有效判别表达式的输入格式是否有误(如缺失操作数、非法算符、括号不匹配等错误),若输入格式错误,输出错误提示。n[测试数据]n1、#6+3*(9-7)-8/2#n2、#(8-2)/(3-1)*(9-6)#n3、#5+a*(8-4
利用栈实现四则运算表达式求值,附Python代码
中缀表达式和后缀表达式nn平时用到的标准的四则运算表达式就叫做中缀表达式,例如“9 +(3 - 1) * 3 + 10 / 2)”,特点是运算符在数字中间;nn后缀表达式就是一种把运算符放在数字后面的形式,“9 3 1 - 3 * + 10 2 / +”即为上例中缀表达式对应的后缀表达式形式,后缀表达式还有一个特点就是消除了所有的括号;nn中缀表达式能够非常直观地展示出运算关系,很方便手动计算,但...
栈的应用之中缀表达式求值(QT平台)
本程序利用两个栈——一个符号栈一个数字栈,实现了中缀表达式的计算,代码风格是C++,运行平台是QT,欢迎大家下载参考。
数据结构 算术表达式求值 C++ 栈方法
数据结构课程设计之C++编写的算术表达式求值,支持括号运算、小数运算、支持错误点报错(非法字符、括号不完整、缺运算数、算式不完整等)、支持中间过程显示(输入串、运算数栈、操作符栈);压缩包内为DevC++项目,也可自建成VC项目运行 注意:包内main.exe是旧版本有问题的编译,请自行删除,运行试用请运行【算术表达式求值-字符界面.exe】
数据结构——栈的应用(表达式求值)(C语言)
char Precede(char t1, char t2)函数用于输出t1,t2两个运算符的优先级(t1为先出现的运算符(已经压入栈OPTR中),t2为后出现的运算符)char Precede(char t1, char t2){ rn int i,j; rn char pre[][7]={ rn //运算符之间的优先级制作成一张表格 rn {'>
c语言 实现二叉树操作 用栈实现算术表达式求值
(1)题目一的内容和要求: 1、编写已知二叉树的先序、中序序列,恢复此二叉树的程序 2、编写求二叉树深度的程序 (2)题目二的内容和要求: 1、算术表达式由操作数、运算符和界限符组成。操作数是正整数,运算符为加减乘除,界限符有左右括号和表达式起始 2、将一个表达式的中缀形式转化为相应的后缀形式 3、依据后缀表达式计算表达式的值
栈的应用之表达式求值(算符优先法)
为了简化问题,我们只考虑+、-、*、/四种运算,他们的优先级规则: n(1)先乘除,后加减 n(2)从左算到右 n(3)先括号内,再括号外为了实现算符优先算法,需要两个工作栈,一个用来存放操作数(CZS),一个用来存放运算符(YSF)。 n算法的基本思想: n(1)首先置操作数栈、运算符栈均为空,将‘#’压入运算符栈。 n(2)依次读入表达式中的每个字符,如果是操作数则直接压入操作数栈(当然,操作数
C++算术表达式求值(支持函数)
C++算术表达式求值(支持函数) sin cos tan asin acos atan log sqrt cos(sin(sqrt(100*sqrt(100*10^2))))*(1.0e+5)/(1.0e-5) = 8.74513e+009
表达式求值(C语言栈实现)
表达式求值(C语言栈实现).已测试,没有任何错误和警告
C/C++计算器(利用栈表达式求值,支持函数运算)
表达式求值是程序设计语言编译中的一个基本问题。它的实现就是对“栈”的典型应用。其实现思想和数据结构书上基本一致,不同的增加的函数计算,并可以扩充,利用两个栈:一个操作数栈和一个运算符栈。计算器C/C++实现代码: n(开发环境:Dev-Cpp编译器)1.Express.h 代码:#include <string>n#include <stack>n#include <cctype>n#include
数据结构之---C语言实现栈的表达式求值(表达式树)
数据结构之---C语言实现栈的表达式求值(表达式树)
C语言数据结构用栈实现表达式求值
C语言数据结构用栈实现表达式求值,全部工程代码。实现visual2010下运行
java实现双栈计算整数表达式
1.栈的规则rn栈的规则就是使用后进先出的方式。元素的处理顺序和它们被压入栈的顺序正好相反。(java给我们提供了stack类,就可以直接使用Stack类来执行往栈内压入元素,从栈内弹出元素等操作)。rn2.整数表达式求值的思想rn分析:rn表达式里面有两种元素,一种是符号元素,一种是数字元素。而优先级则是 "()"  >  " *和/ "  >  " +和- " 。所以我们每次操作需要一个运算符
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 用python数据结构教程 用java实现班级通讯录