链栈的出栈函数执行两次,出来的返回值(被删除的栈顶元素)却一样,请问这是怎么一回事?

[复制链接]
查看11 | 回复4 | 2021-1-27 07:13:52 | 显示全部楼层 |阅读模式
题目描述:算数四则运算的规则是1)先乘除,后加减;2)从左算到右;3)先括号内,后括号外。
由此,算式4+2*3-10/5的计算顺序为4+2*3-10/5=4+6-10/5=4+6-2=8。
给定一个以“#”作为结束符的算式,求出算式的结果
【输入形式】以“#”结尾的表达式,运算数为正整数。每个表达式占一行。【输出形式】输出表达式运算的结果。
【样例输入】
4+23-10/5#?3(7-2)#
2*3/2#
【样例输出】
8
15
3即链栈的出栈函数执行第二次的返回值b永远等于函数执行第一次的返回值a。
刚学数据结构一个月,求各位大神指点迷津。感激不尽!!





分 -->
回复

使用道具 举报

千问 | 2021-1-27 07:13:52 | 显示全部楼层
入栈代码也发一下吧,这个出栈函数有点问题但看不出关键错误
回复

使用道具 举报

千问 | 2021-1-27 07:13:52 | 显示全部楼层
#include
#include
typedefstructSNode//定义运算符OPTR数据类型
{
chardata;
structSNode*next;
}OpStack,*LinkStack;
typedefstructSNode1//定义运算数OVS数据类型
{
floatdata1;
structSNode1*next;
}OvStack,*LinkStack1;
voidpush(OpStack*s,charn)//在运算符栈的顶部插入n
{
OpStack*temp;
temp=(OpStack*)malloc(sizeof(OpStack));
temp->data=n;
temp->next=s->next;
s->next=temp;
}
voidpush1(OvStack*s,floatn)//在运算数栈的顶部插入n
{
OvStack*temp;
temp=(OvStack*)malloc(sizeof(OvStack));
temp->data1=n;
temp->next=s->next;
s->next=temp;
}
intpop(OpStack*top,char*x)//将运算符栈顶元素p弹出,放到x所指的存储空间中
{
OpStack*p;
p=top->next;//定义p为第一个元素
if(top==NULL)return0;
*x=p->data;
top->next=p->next;
free(p);//释放p
return1;
}
intpop1(OvStack*top,float*y)//将运算数栈顶元素p弹出,放到y所指的存储空间中
{
OvStack*p;
p=top->next;//定义p为第一个元素
if(top==NULL)return0;
*y=p->data1;
top->next=p->next;
free(p);//释放p
return1;
}
charGetTop(OpStack*s)//取运算符栈顶元素
{
charn;
n=s->next->data;
returnn;
}
floatGetTop1(OvStack*s)//取运算数栈顶元素
{
floatn;
n=s->next->data1;
returnn;
}
charCompare(chara,charb)//比较运算符的优先级
{
if(a=='(')
{
switch(b)
{
case'#':return'';break;
case'+':return'';break;
case'+':return'';break;
case'-':return'>';break;
case'*':return'';break;
case'(':return'';break;
}
}
if(a=='-')
{
switch(b)
{
case'+':return'>';break;
case'-':return'>';break;
case'*':return'';break;
case'(':return'';break;
}
}
if(a=='*')
{
switch(b)
{
case'+':return'>';break;
case'-':return'>';break;
case'*':return'>';break;
case'/':return'>';break;
case'#':return'>';break;
case'(':return'';break;
}
}
if(a=='/')
{
switch(b)
{
case'+':return'>';break;
case'-':return'>';break;
case'*':return'>';break;
case'/':return'>';break;
case'#':return'>';break;
case'(':return'';break;
}
}
return0;
}
floatGetNumber(char*ch)//将输入的char类型值,若不是字符,转换为数值
{
chartemp[50];floatm;
intj=0;inti=0;
while(ch!='+'&&ch!='-'&&ch!='*'&&ch!='/'&&ch!='#'&&ch!='\0'&&ch!='('&&ch!=')')
{
temp[j]=ch;i++;j++;
}
m=atof(temp);//string转化为float型
returnm;
}
intIn(charch)//判断输入字符是否为字符,n==1时代表输入字符为字符,n==0时代表输入字符为数字
{
if(ch=='+')return1;
elseif(ch=='-')return1;
elseif(ch=='*')return1;
elseif(ch=='/')return1;
elseif(ch=='#')return1;
elseif(ch=='(')return1;
elseif(ch==')')return1;
elsereturn0;
}
floatExcute(floata,charop,floatb)//对a,b执行基本运算
{
switch(op)
{
case'+':return(a+b);break;
case'-':return(a-b);break;
case'*':return(a*b);break;
case'/':return(a/b);break;
default:return0;
}
}
floatExpEvalution(OpStack*OPTR,OvStack*OVS,char*ch)//表达式求值
{
floatx,a,b,v;
charop,n;
inti=0;
push(OPTR,'#');
while(ch!='#'||GetTop(OPTR)!='#')
{
if(In(ch)==0)//ch为数字
{
x=GetNumber(ch);
push1(OVS,x);
//while(ch!='+'&&ch!='-'&&ch!='*'&&ch!='/'&&ch!='#'&&ch!='\0'&&ch!='('&&ch!=')')
i++;
}
else
if(ch=='(')
{
push(OPTR,ch);
i++;
continue;
}
else
{
switch(Compare(ch,GetTop(OPTR)))
{
case'=':
pop(OPTR,&n);
i++;
break;
case'>':
push(OPTR,ch);
i++;
break;
case'
回复

使用道具 举报

千问 | 2021-1-27 07:13:52 | 显示全部楼层
引用1楼akari10032的回复:入栈代码也发一下吧,这个出栈函数有点问题但看不出关键错误你好,完整代码我已经发在下面啦,谢谢!
回复

使用道具 举报

千问 | 2021-1-27 07:13:52 | 显示全部楼层
这个问题已经解决,是GetNumber函数的问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行