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

问题描述

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

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

#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成功");
}
int panzhankong2(SqStack2 *zifu)
{
if(zifu->top2==-1)
return 1;
else return 0;
printf("判栈空2成功");
}

int jinzhan1(SqStack1 *shuzi,int a)
{

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

zifu->top2++;
zifu->suanfu[zifu->top2]=a;
return 1;
printf("字符进站成功");
}
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]!='';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]);

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

时间: 2024-11-02 17:20:09

c语言栈-栈的问题,用栈编写一个算术表达式求值的相关文章

数据结构课程设计-用栈实现表达式求值的方法详解_C 语言

1.需求分析设计一个程序,演示用算符优先法对算术表达式求值的过程.利用算符优先关系,实现对算术四则混合运算表达式的求值.(1)输入的形式:表达式,例如2*(3+4)     包含的运算符只能有'+' .'-' .'*' .'/' .'('. ')':(2)输出的形式:运算结果,例如2*(3+4)=14:(3)程序所能达到的功能:对表达式求值并输出 2.系统设计1.栈的抽象数据类型定义:ADT Stack{数据对象:D={ai|ai∈ElemSet,i=1,2,-,n,n≥0}数据关系:R1={<

C语言数据结构:表达式求值代码问题

问题描述 C语言数据结构:表达式求值代码问题 要求允许小数,过滤空格,可以+ - * /和求指数 #include #include #include #include #define true 1 #define false 0 #define OPSETSIZE 8 //运算符集合数为8 char OPSET[OPSETSIZE] = { '+', '-', '*', '/', '(', ')', '#', '^' }; unsigned char Prior[8][8] = { /****

java实现任意四则运算表达式求值算法_C 语言

本文实例讲述了java实现任意四则运算表达式求值算法.分享给大家供大家参考.具体分析如下: 该程序用于计算任意四则运算表达式.如 4 * ( 10 + 2 ) + 1 的结果应该为 49. 算法说明: 1. 首先定义运算符优先级.我们用一个 Map<String, Map<String, String>> 来保存优先级表.这样我们就可以通过下面的方式来计算两个运算符的优先级了: /** * 查表得到op1和op2的优先级 * @param op1 运算符1 * @param op2

c语言-参照网上,自己改用链栈写了个表达式求值的代码出现的问题

问题描述 参照网上,自己改用链栈写了个表达式求值的代码出现的问题 这个代码可以编译运行,但是输入值进行计算的时候就会停止工作 附上代码: 附上代码求指导: #include #include typedef struct rope { char date; struct rope next; } node,*pnode; typedef struct rope2 { char date; struct rope2 *next; } nodes,*pnodes; typedef struct a

C++利用链栈实现表达式求值_C 语言

本文实例为大家分享了C++利用链栈实现表达式求值的具体代码,供大家参考,具体内容如下 #include<iostream.h> typedef int Status; typedef char Cstack; #define OK 1 #define ERROR 0 typedef struct StackNode { Cstack data; struct StackNode *next; }StackNode,*LinkStack; Status InitStack(LinkStack &

c++-运用C++栈,链表等基础知识编写一个可运行的迷宫

问题描述 运用C++栈,链表等基础知识编写一个可运行的迷宫 1.1 问题描述:迷宫求解是实验心理学中的一个经典问题.从一个入口处进入迷宫,在迷宫中设置很多的障碍,前进的方向有上.下.左.右,有一个唯一的出口.给出在迷宫中寻找通路到达出口的过程.1.2 基本要求:1.2.1 设计数据结构存储迷宫1.2.2 设计存储结构存储从入口到出口的通路1.2.3 设计算法完成迷宫的求解1.2.4 分析算法的时间复杂度运用C++栈,链表等基础知识编写一个可运行的迷宫,这是数据结构的一知识迷宫图大致为从左上角走到

问题求助 数据结构-使用双栈实现中缀表达式求值一个字符栈一个数字栈

问题描述 使用双栈实现中缀表达式求值一个字符栈一个数字栈 程序写好没输出啊,急求啊......主要BUG 在Nibolansuanfa()这个自定义函数里面前面的可以忽略..... /*核心函数*/ double Nibolansuanfa(char *str,stack *s) { initstack(&s);//初始化栈 char st[20],tc,xy;//st[20]里面放数字字符串 int j=0,i=0,yxcount=0; double d; while(str[j]!='')

数据结构 栈的应用-请教数据结构后缀表达式 求值问题

问题描述 请教数据结构后缀表达式 求值问题 要求是:设操作数:0,1,2,--,8,9(可扩充): 运算符:+,-,*,/,(,),#(#号为结束). 输入中缀表达式,如:5+(4-2)*3 #,将其转换成后缀表达式:542-3*+#,然后计算,本例结果为11.需要实现循环输入表达式,我虽然写了do-while却总是无法实现循环,不知道问题出在哪里.代码如下:#include#include#include#define Maxsize 100typedef struct { char data

用C语言写解释器(二)——表达式求值

声明 为提高教学质量,我所在的学院正在筹划编写C语言教材.<用C语言写解释器>系列文章经整理后将收入书中"综合实验"一章.因此该系列的文章主要阅读对象定为刚学完C语言的学生(不要求有数据结构等其他知识),所以行文比较罗嗦,请勿见怪.本人水平有限,如有描述不恰当或错误之处请不吝赐教!特此声明. 内存管理 既然是表达式求值,自然需要在内存中保存计算结果以及中间值.在<用C语言写解释器(一)>中提过:变量要求是若类型,而 C 语言中的变量是强类型,为实现这个目标就需要