栈的问题,用栈编写一个算术表达式求值

用栈做一个简单的算术运算,我觉得思想没问题,可是编译不过去,上网找了很多资料,觉得是栈的基本操作有问题,初始化有问题,可具体是什么错误我也不是很了解,求大神指教!!

#include
#include

typedef struct

{
int data[100];
int top1;
}SqStack1;
typedef struct

{
char suanfu[100];
int top2;
}SqStack2;
SqStack1 shuzi;
SqStack2 zifu;
char zcsuanfu;
int chushihua1(SqStack1 *shuzi)
{

if((shuzi=(SqStack1*)malloc(sizeof(SqStack1)))==NULL)
return 0;
shuzi->top1=-1;
return 1;

}
int chushihua2(SqStack2 zifu)
{
if((zifu=(SqStack2
)malloc(sizeof(SqStack2)))==NULL)
return 0;
zifu->top2=0;
zifu->suanfu[0]='=';
return 1;
}
int panzhankong1(SqStack1 *shuzi)
{
if(shuzi->top1==-1)
return 1;
else return 0;
printf("判栈空1成功\0");
}
int panzhankong2(SqStack2 *zifu)
{
if(zifu->top2==-1)
return 1;
else return 0;
printf("判栈空2成功\0");
}

int jinzhan1(SqStack1 *shuzi,int a)
{

shuzi->top1++;
shuzi->data[shuzi->top1]=a;
return 1;
printf("数字进站成功\0");
}
int jinzhan2(SqStack2 *zifu,char a)
{

zifu->top2++;
zifu->suanfu[zifu->top2]=a;
return 1;
printf("字符进站成功\0");
}
int chuzhan1(SqStack1 *shuzi,int *a)
{
if(panzhankong1(shuzi)) return 0;
*a=shuzi->data[shuzi->top1];
shuzi->top1--;
return 1;
}
int chuzhan2(SqStack2 *zifu,char *a)
{
if(panzhankong2(zifu)) return 0;
*a=zifu->suanfu[zifu->top2];
zifu->top2--;
return 1;
}
void suanfubijiao(char a,char b,SqStack1 *shuzi,SqStack2 *zifu)
{
void shuchujieguo(int i);
int i;

switch(a)
{
case'+':
case'-':
if((b=='*')||(b=='/')||(b=='('))
i=1;
else i=3; break;
case'*':
case'/':
if(b=='(')
i=1;
else i=3; break;
case'(':
if(b=='=')
printf("输入有误");
else if(b==')')
i=2;
else i=1;break;
case')':
if(b=='(')
printf("输入有误");
else i=3;break;
case'=':
if(b=='=')
i=2;
else if(b==')')
printf("输入有误");
else i=1;break;
default:printf("有误");break;
}
shuchujieguo(i,shuzi,zifu);
}
void shuchujieguo(int i,SqStack1 *shuzi,SqStack2 *zifu)
{
int jisuanjieguo(int a,char ch,int b);
char ch;
int a,b,c;
if(i==3)
{chuzhan2(zifu,&ch);
chuzhan1(shuzi,&a);
chuzhan1(shuzi,&b);
c=jisuanjieguo(a,ch,b);
jinzhan1(shuzi,c);
suanfubijiao(zcsuanfu,zifu->suanfu[zifu->top2],shuzi,zifu);

}
if(i==2)
{
chuzhan2(zifu,&ch);
}
if(i==1)
{
jinzhan2(zifu,zcsuanfu);
}
}
int jisuanjieguo(int a,char ch,int b)
{
int c;
switch(ch)
{
case'+':c=a+b;break;
case'-':c=a-b;break;
case'*':c=a*b;break;
case'/':c=a/b;break;
default:break;
}
return c;
}
void shuru(SqStack1 *shuzi,SqStack2 *zifu)
{
char d[100];
int i,sum=0;
printf("请输入算术表达式,=表示结束");
scanf("%s",d);
for(i=0;d[i]!='\0';i++)
{
if((d[i]>='0')&&(d[i]<='9'))
{sum=d[i]-'0';
jinzhan1(shuzi,sum);
}
else
{
zcsuanfu=d[i];
suanfubijiao(zcsuanfu,zifu->suanfu[zifu->top2],shuzi,zifu);
}
}

}
void main()
{

SqStack1 *s=&shuzi;
SqStack2 *z=&zifu;
chushihua1(s);
chushihua2(z);

shuru(s,z);
printf("%d",s->data[s->top1]);

}
用断点在进栈操作的时候就有问题。。。

c
0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
栈的操作和c语言实现算术表达式求值
栈是一种特殊的线性表,anzh
利用栈实现算术表达式求值(Java语言描述)
算术表达式求值是栈的典型应用,
数据结构实验十 利用栈实现算术表达式的求值
[问题描述] 利用栈实现算术表达式的求值。可以简单一些,假设表达式中含有一位整数,以及+、-、*、/、(、)。但不受此限制。(难易程度:中) [实验目的] 1、掌握栈的应用。 2、掌握算符优先表达式求值的算法。 3、掌握字符串处理和数值的转换。 [实验内容及要求] 1、表达式以字符串形式输入,并以‘#’开始和结束(‘#’也作为算法来处理)。如输入:#6+3*(9-7)-8/2# ...
基于栈的算术表达式求值算法
实验题目: 基于栈的算术表达式求值算法 实验环境: 学习完了数据结构第三章内容栈和队列 实验目的:    1.掌握栈的定义及实现;    2.掌握利用栈求解算术表达式的方法。 实验内容:    通过修改完善教材中的算法3.1-3.4,利用栈来实现算术表达式求值的算法。对算法中调用的几个函数要给出其实现过程:    (1) 函数In(c):判断c是否为运算符;    (2) 函数Precede(t1,t2):判断运算符t1和t2的优先级;  (3) 函数Operate(a,theta,b):对a和b进行二元运算theta。 程序运行时,输入合法的算术表达式(中间值及最终结果要在0~9之间,可以包括加减乘除和括号),便可输出相应的计算结果。
算术表达式求值(栈的应用)
算术表达式求值的难点 运算符有优先规则 对于一般的算术表达式a*b+(c-d/e)*f来说,如果要对它求值,在计算机取到×的时候,不能直接运算,需要继续往后取值,找是否有比×运算级高的符号,没有的话才能运算。 运算符的操作数是否能直接操作 而且还不能保证它的两个操作数都是可以直接操作的,比如针对上式的+来说,它的两个操作数a*b和(c-d/e)*f是不能直接操作的,需要进一步计算a...
数据结构 栈的应用——算术表达式求值
实验目的 : 1 .掌握栈的定义及实现; 2 .掌握利用栈求解算术表达式的方法。 实验内容: 通过修改完善教材中的算法3.4,利用栈来实现算术表达式求值的算法。对算法3.4中调用的几个函数要给出其实现过程: (1) 函数In(c):判断c是否为运算符; (2) 函数Precede(t1,t2):判断运算符t1和t2的优先级; (3) 函数Operate(a,theta
利用栈实现算术表达式的求值
[问题描述] 利用栈实现算术表达式的求值。可以简单一些,假设表达式中含有一位整数,以及+、-、*、/、(、)。但不受此限制。(难易程度:中) [实验内容及要求] 1、表达式以字符串形式输入,并以‘#’开始和结束(‘#’也作为算法来处理)。如输入:#6+3*(9-7)-8/2# 2、能够有效判别表达式的输入格式是否有误(如缺失操作数、非法算符、括号不匹配等错误),若输入格式错误,输出错误提示。 [测试数据] 1、#6+3*(9-7)-8/2# 2、#(8-2)/(3-1)*(9-6)# 3、#5+a*(8-4
栈实现表达式求值(C语言)
刚刚学习C语言的时候很多人就写过计算器,但是当时写的计算器只能进行一步四则运算;对于一次输入(1+2)*3+4这样的运算则没有办法计算。 本篇博文利用栈这种数据结构实现了支持带括号的表达式求值计算器;栈有栈底和栈顶指针,元素是先进后出;对于栈的操作最主要的是创建、压栈、弹栈;在实现计算器时,我们输入的表达式叫做中缀表达式,我们需要将其转为后缀表达式;然后利用后缀表达式求取表达式的值;
算法表达式求值演示(栈的应用)
【问题描述】 表达式计算是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。设计一个程序,演示用算符优先法对算术表达式求值的过程。 【实现要求】 (1) 以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。利用下表给出的算符优先关系,实现对算术混合运算表达式的求值,并仿照求值中运算符栈、运算数栈、输入字符和主要操作的变化过程。 (2) 扩充运算符集,如增加乘方、单目减、赋值等运算...
算法 -- 双栈算术表达式求值算法
算法 – 双栈算术表达式求值算法最近在学习算法时候,看到一个双栈算术表达式求值算法,挺启发我的;平常大家在写代码的时候要写表达式的时候,基本都是直接 (1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) );这样程序会帮你的自动计算出结果,大家有没用想过这程序是如何一步一步计算并得出你需要的值,今天讲一个简单例子,可以帮助大家很好的了解双栈算术表达式求值算法是什么。 首先,为了简单化的解释
算术表达式求值-中缀表达式(栈实现)-Java
中缀表达式是我们最常见的算术表达式,在人类看来比较直观,而用机器实现有点复杂。这里的方法利用两个栈,一个用来放数字numStack,一个用来放符号opStack。 具体步骤如下: 从左到右扫描表达式 1.扫描到数值,把数值压入数字栈numStack。 2.扫描到数学符号 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.1扫描到加减号‘+’,‘-’,符号栈里的符号一个个出栈,同时出一个...
(数据结构实验)栈的应用-算术表达式求值
实验目的: 1.掌握栈的定义及实现; 2.掌握利用栈求解算术表达式的方法。   实验内容: 通过修改完善教材中的算法3.22,利用栈来实现算术表达式求值的算法。 对算法3.22中调用的几个函数要给出其实现过程: (1) 函数In(c):判断c是否为运算符; (2) 函数Precede(t1,t2):判断运算符t1和t2的优先级; (3) 函数Operate(a,theta,b):...
数据结构——算术表达式求值(顺序栈的实现)
数据结构——算术表达式求值(顺序栈的实现) //算术表达式 (顺序栈的实现) #include&amp;amp;lt;stdio.h&amp;amp;gt; #include&amp;amp;lt;malloc.h&amp;amp;gt; #include&amp;amp;lt;stdlib.h&amp;amp;gt; #include&amp;amp;lt;string.h&amp;amp;gt; #define OK 1 #define ERROR 0 #define
数据结构(6)--栈的应用之中缀表达式求值
参考书籍:数据结构(C语言版) 严蔚敏 吴伟民编著 清华大学出版社 本文中的代码可从这里下载:https://github.com/qingyujean/data-structure 1.简要说明 分析:设操作符栈op栈 操作数栈num栈 op栈里不可能出现')',只可能有'+'、'-'、'*'、'/'、'(',设ch为当前字符,假设输入都是合法的 1.ch为'+'、'-',则...
栈的应用之中缀表达式求值(QT平台)
本程序利用两个栈——一个符号栈一个数字栈,实现了中缀表达式的计算,代码风格是C++,运行平台是QT,欢迎大家下载参考。
栈的应用之算术表达式求值
栈是一种后进先出的数据结构。表达式求值是对栈的一个典型的应用。 对于如下一个表达式: 1 + 2 * (3 + 4) 此算术表达式由一些操作符和操作数组成。其中,操作符有‘+’、‘*’、‘(’等,操作数有‘1’、‘2’、‘3’等。对于操作符来说,其运算是有优先级的。比如,上述表达式中,3+4应该先进行操作,将得到的结果再与2相乘。算符间的优先关系如下: 运算符 + - *
数据结构课程设计---------用栈来实现表达式求值
1、需求分析 设计一个程序,演示用算符优先法对算术表达式求值的过程。利用算符优先关系,实现对算术四则混合运算表达式的求值。 (1)输入的形式:表达式,例如2*(3+4)      包含的运算符只能有'+' 、'-' 、'*' 、'/' 、'('、 ')'; (2)输出的形
掌握基于栈实现算术表达式求值的原理和算法
掌握基于栈实现算术表达式求值的原理和算法。 使用VC++语言编写程序,根据数据结构中栈的的逻辑特性和物理存储结构,使用栈实现考虑算符优先的算术表达式求值算法,编译运行程序。
数据结构Java实现——①栈-->栈的应用三、算术表达式求值
当一个算术表达式中含有多个运算符,且运算符的优先级不同的情况下,如何才能处理一个算术表达式????? 2、思路 首先我们要知道表达式分为三类: ①中缀表达式:a+(b-c/d)*e ②前缀表达式+a*-b/cde ③后缀表达式abcd/-e*+ 由于运算符有优先级,所以在计算机中计算一个中缀的表达式非常困难,特别是带括号的更麻烦,而后缀表达式中既无运算符优先又无括号的约束问题因为在后缀表达式中运算符出现的顺序正是计算的顺序,所以计算一个后缀的表达式更简单。 所以,可以将求算术表达式的值的过程化
【模板题】【栈】表达式求值问题总结:6263:布尔表达式,01:简单算术表达式求值,4132:四则运算表达式求值(终极BOSS)
6263:布尔表达式:输入一个布尔表达式,请你输出它的真假值 样例输入: ( V | V ) &amp;amp; F &amp;amp; ( F| V) !V | V &amp;amp; V &amp;amp; !F &amp;amp; (F | V ) &amp;amp; (!F | F | !V &amp;amp; V) (F&amp;amp;F|V|!V&amp;amp;!F&amp;amp;!(F|F&amp;amp;V)) 思路:本题的关键就是定义优先级,表中含义是后...
四则运算表达式求值(中缀表达式与后缀表达式转换)--- 栈的应用
中缀表达式转后缀表达式 首先借助辅助栈,遇到数字和字符直接打印,遇到符号把当前符号和栈顶元素进行优先级比较,如果当前元素优先级高,直接入栈,如果当前元素优先级低,则将栈内元素一次出栈再将当前元素入栈,遇到左括号,无条件入栈,遇到右括号,将栈内元素依次输出,直到左括号为止。 中缀表达式:(9+6)* 7 - 8/2=====&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;后缀表达式:9 6 + ...
用栈对算术表达式求值
假设算术表达式只包含”+”、“-”、“*”、“/”、正整数和括号的合法数学表达式。求算术表达式值的过程是:先将算术表达式转换成后缀表达式(逆波兰式),然后对该后缀表达式求值。   1)将算术表达式exp转换成后缀表达式postexp;   2)对后缀表达式postexp求值。   完整代码如下:  #include <stdio.h> #include <stdlib.h> #define M
栈的应用:逆波兰表达式求值
Hello,本篇博客Val主要来给大家分享一下栈的一个用途:逆波兰表达式求值。逆波兰表达式也叫后缀表达式,先操作数,后操作符。 栈 后进先出 ,顺序遍历波兰表达式,遇到操作数的时候入栈 , 遇到操作符,先让操作数出栈运算操作数,然后再把运算结果入栈,所有的算式都可以用逆波兰表达式写出来。把算式12*(3+4)-6+8/2+2用逆波兰表达式写出来,就是 12 3 4 + * 6 - 8 2 /
使用栈实现表达式求值
任何一个表达式都是由操作数,运算符,界限符组成的。操作数即是参加运算的数值或者变量,运算符则是加减乘除等组成,为简单起见,这里只实现加减乘除的运算,而常见的界限符则是左右括号和终止符。在运算过程中,要判断两个先后出现的运算符之间的优先顺序。 为了实现算法,设置两个工作栈:用于存储运算符的栈opter,以及用于存储操作数及中间结果的栈opval。 算法基本思想如下: (1)首先将操作数栈opv
栈的应用之后缀表达式求值
在这里使用的是顺序栈,头文件可参考前文.cpp文件:/*后缀表达式的求法*/ #include &amp;lt;iostream&amp;gt; #include &amp;lt;strstream&amp;gt; using namespace std; typedef float ElemType; const int StackMaxSize = 50; struct Stack { ElemType s...
中缀表达式的求值(栈实现)
模拟计算器的功能,对输入的一串表达式进行求值。算法定义了运算符的优先级,最后利用栈的方法来实现。
表达式求值(采用栈实现)
利用栈实现算术表达式的求值,表达式中可包含加+、减(负) -、乘*、除/、 乘方^、括号( )运算符,操作数可以为浮点数。 可采用直接求中缀表达式的方法, 也可采用先转换成后缀表达式后再求值的方法(参看课件) 。 实现时需注意如下: ( 1)带小数点的数值生成 ( 理解整数数值的生成,小数部分的处理与之类似)。 ( 2)考虑负号的情况。负号与减号形式上一样,如何区分? • 输入的表达式串中第 1 个字符是’-’ – 可断定此’-’是负号 • 其余的’-’ – 若紧接在’(’之后的’-’可断定是负号 ( 3)负号的处理 • 方法 1:若已断定是负号,可先压入数值 0 进入操作数栈,如此,可 将负号看作减号。 • 方法 2: 若已断定是负号,则紧接其后的数字字符转换成数值后,要 将其对应的相反数(负数)压入操作数栈
栈的应用之表达式求值(后缀式运算)
1、逆波兰表达式简介  假定给定一个只 包含 加、减、乘、除,和括号的算术表达式,你怎么编写程序计算出其结果。问题是:在表达式中,括号,以及括号的多层嵌套 的使用,运算符的优先级不同等因素,使得一个算术表达式在计算时,运算顺序往往因表达式的内容而定,不具规律性。 这样很难编写出统一的计算指令。   使用逆波兰算法可以轻松解决。他的核心思想是将普通的中缀表达式转换为后缀表达式。  转换为后缀表达式的...
栈的运用(算数表达式求值的算符优先算法 十以内简单版)
假定运算符有加(+),减(-),乘(*),除(/)),操作数限制为一位数,圆括号看作分界符。中缀表达式 a*b+c a+b*c a+(b*c+d)/e 后缀表达式(RPN) ab*c+ abc*+ abc*d+e/+中缀表达式:设两个栈, 操作数栈(opnd)和运算符栈(optr)按以下规则进行:
基于栈结构的中缀表达式求值实验报告
基于栈结构的中缀表达式求值 用c语言详细的叙述了如何求栈结构的中缀表达式的值
算术表达式求值 - 栈的应用
一、实验目的 1、掌握栈的定义及实现; 2、掌握利用栈求解算术表达式的方法。 二、实验内容 通过修改完善教材中的算法3.4,利用栈来实现算术表达式求值的算法。对算法3.4中调用的几个函数要给出其实现过程: 1、函数In(c):判断c是否为运算符; 2、函数Precede(t1,t2):判断运算符t1和t2的优先级; 3、函数Operate(a,theta,b):对a和b进行二元运算th
数据结构第二次作业(表达式求值【栈模拟】)
实验题目:栈的应用-算术表达式求值                                          实验目的 : 1 .掌握栈的定义及实现; 2 .掌握利用栈求解算术表达式的方法。 实验内容: 通过修改完善教材中的算法3.4,利用栈来实现算术表达式求值的算法。对算法3.4中调用的几个函数要给出其实现过程: (1)
c/c++表达式求值,即包含加减乘除以及括号的式子(栈)
首先要了解前缀表达式,中缀表达式,后缀表达式 其实三者的区别用一句话就可概括,中缀表达式是给人算的,前缀,后缀表达式是给计算机计算的 它们都是对表达式的记法,因此也被称为前缀记法、中缀记法和后缀记法。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。 举例: (3 + 4) × 5 - 6 就是中缀表达式 - × + 3 4
在C++中使用栈来把中缀表达式转换为后缀表达式并求值,简单明了
#include #include//头文件包含atoi()函数 using namespace std; typedef char T; class stack{ T data[100]; int sz; public: stack() :sz(){} void push(const T& d){ if (full()) thr
c语言 实现二叉树操作 用栈实现算术表达式求值
(1)题目一的内容和要求: 1、编写已知二叉树的先序、中序序列,恢复此二叉树的程序 2、编写求二叉树深度的程序 (2)题目二的内容和要求: 1、算术表达式由操作数、运算符和界限符组成。操作数是正整数,运算符为加减乘除,界限符有左右括号和表达式起始 2、将一个表达式的中缀形式转化为相应的后缀形式 3、依据后缀表达式计算表达式的值
栈的应用_简单表达式求值
#include "sqstack.cpp" #include "sqstack1.cpp" #include void trans(char *exp,char postexp[])     //把表达式exp转化为后缀表达式postexp { char e; SqStack *Optr; InitStack(Optr); int i=0; while(*exp!='\0')
利用栈实现四则运算表达式求值,附Python代码
中缀表达式和后缀表达式 平时用到的标准的四则运算表达式就叫做中缀表达式,例如“9 +(3 - 1) * 3 + 10 / 2)”,特点是运算符在数字中间; 后缀表达式就是一种把运算符放在数字后面的形式,“9 3 1 - 3 * + 10 2 / +”即为上例中缀表达式对应的后缀表达式形式,后缀表达式还有一个特点就是消除了所有的括号; 中缀表达式能够非常直观地展示出运算关系,很方便手动计算,但...
算术中缀表达式求值(栈实现)
问题描述:输入由整型分量和操作符组成的中缀表达式,输出其后缀表达式和运算的结果。整型分量:十进制数。操作符:( , ) , + , - , * , / 。如输入3*(5-8/2)+7,输出 3 5 8 2 / - * 7 +,结果是10;输入3-(1/4+7)*3 ,输出 3 1 4 / 7 + 3 * -,结果是 -18.75;输入3*4/5*(5-7)+4,输出 3 4 * 5 / 5 7 -...
数据结构例程——表达式求值(用栈结构)
本文针对数据结构基础系列网络课程(3):栈和队列中第5课时栈的应用1-表达式求值。例:用户输入一个包含“+”、“-”、“*”、“/”、正整数和圆括号的合法数学表达式,计算该表达式的运算结果。 解答:#include <stdio.h> #include <stdlib.h> #define MaxOp 100 #define MaxSize 100 struct //设定运算符优先级 {
栈的应用之中缀表达式求值
1. 中缀表达式:         若表达式的每个耳目运算符(+、—、* 、 / )都放在两个操作数之间, 且每个单目运算符都放在操作书的前面,则表达式为中缀表达式。如,8.5 + 2 * 3   , -7 * (4 \ 3 - 6.25)+ 9   2. 表达式的等级:         中缀表达式算法使用等级概念,给表达式中没想元素赋予一个等级值 -1、0、1。具体如下:
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 全栈开发工程师 web全栈