2 u012755858 u012755858 于 2013.11.07 12:51 提问

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

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

#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]);

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
利用栈实现算术表达式的求值
[问题描述] 利用栈实现算术表达式的求值。可以简单一些,假设表达式中含有一位整数,以及+、-、*、/、(、)。但不受此限制。(难易程度:中) [实验内容及要求] 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
算术表达式求值(顺序栈实现)
一.问题描述
用栈对算术表达式求值
假设算术表达式只包含”+”、“-”、“*”、“/”、正整数和括号的合法数学表达式。求算术表达式值的过程是:先将算术表达式转换成后缀表达式(逆波兰式),然后对该后缀表达式求值。   1)将算术表达式exp转换成后缀表达式postexp;   2)对后缀表达式postexp求值。   完整代码如下:  #include <stdio.h> #include <stdlib.h> #define M
算术表达式求值 - 栈的应用
一、实验目的 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) 此算术表达式由一些操作符和操作数组成。其中,操作符有‘+’、‘*’、‘(’等,操作数有‘1’、‘2’、‘3’等。对于操作符来说,其运算是有优先级的。比如,上述表达式中,3+4应该先进行操作,将得到的结果再与2相乘。算符间的优先关系如下: 运算符 + - *
基于栈的中缀算术表达式求值
栈的简单应用:需要注意的是运算符优先级,减法计算和除法计算……有些代码重复了,以后记得修改……#include&amp;lt;bits/stdc++.h&amp;gt; using namespace std; typedef struct node { double a; struct node *next; }node,*link; typedef struct snode { cha...
栈的操作和c语言实现算术表达式求值
栈是一种特殊的线性表,anzh
数据结构 栈的应用——算术表达式求值
实验目的 : 1 .掌握栈的定义及实现; 2 .掌握利用栈求解算术表达式的方法。 实验内容: 通过修改完善教材中的算法3.4,利用栈来实现算术表达式求值的算法。对算法3.4中调用的几个函数要给出其实现过程: (1) 函数In(c):判断c是否为运算符; (2) 函数Precede(t1,t2):判断运算符t1和t2的优先级; (3) 函数Operate(a,theta
双栈算术表达式求值算法
import java.util.Scanner; /** * (1+((2+3)*(4*5)))测试 * Created by lizhaoz on 2016/1/8. */ public class DijkstraEvalute { public static void main(String[] args) { Stack ops=new Stack();
栈和队列-算术表达式的求值
【实验目的】 通过上机实践掌握队列和栈的顺序存储结构和链式存储结构,以便我们能在相应的应用问题中正确选用它们;掌握栈和队列的特点,即先进后出与先进先出的原则;掌握栈和队列的基本运算,如入栈和出栈、入队与出队等运算在顺序存储结构和链式存储结构上的实现。 【实验内容】 实验题目一:算术表达式的求值 【实验步骤】 1.设计一个程序演示用算符优先法对算术表达式的求值过程。 2.以字符序列形式从终端输入语法正确的、不含变量的整数表达式。利用课本3.2.5节中给出的算符优先关系,实现