在学习数据结构,尝试使用堆栈方法计算字符串常量算式8+8*8+8
使用单链表方法
在断点找错后发现具体错误发生在此处
单次运算(&栈,i);//调用
int 单次运算X(struct 算栈* 值, int data) {
int i, i1, i2;
if (弹栈(&值, &i1) * 弹栈(&值, &i2) == 0)return 0;
switch ((char)data)
{
case'+':i = i1 + i2; break;
case'-':i = i1 - i2; break;
case'*':i = i1 * i2; break;
case'/':i = i1 / i2; break;
default:return 0;
}
压栈(&值, i);//这里的压栈过程成功了
return 1;//断点到此处时一切正常
//但是return函数结束后[值]这个栈的地址被改了,导致我接下来的操作栈错误
//问题,这里发生了什么,为什么栈的地址被改变了
//猜测,[值]的地址被改为'1'的字符常量,因为其栈数据和下一节点无法读取
}
问题我已经自行解决,方法如下
值=单次运算(&值,i);//通过return保证最终地址一定会传回
struct 算栈* 单次运算(struct 算栈* 值, int data) {
int i,i1,i2;
if (弹栈(&值, &i1) * 弹栈(&值, &i2)==0)return 0;
switch ((char)data)
{
case'+':i = i1 + i2; break;
case'-':i = i1 - i2; break;
case'*':i = i1 * i2; break;
case'/':i = i1 / i2; break;
default:return 0;
}
压栈(&值, i);
return 值;
}
栈模型
struct 算栈 {
int i;
struct 算栈* last;
};
这里是我在尝试使用C语言编写,示例是C++,我把传入参数的引用改成了二级指针
使用int是在模仿C++的bool类型,在多次改错和调试后找到的问题所在
代码完整部分过长,想看可以再评论说明,我会发在评论
问题如上,为什么return操作改变了我传入的一级指针参数
这个问题啊,其实挺有意思的。就是在搞栈操作时遇到了点小插曲,本来嘛,你想在函数里改变指针的指向,就得给它传一个指针的指针,也就是说,得传入二级指针对吧。看来你已经发现了这个点,用二级指针搞定了它。
那个原始的 单次运算 函数里,你传进去的是 struct 算栈* 的地址,也就变成了 struct 算栈**,在函数里你如果写了像 值 = 新地址 这样的代码,那肯定是在函数里改了指针的指向啦。但这事儿啊,只在函数里有效,一旦出了函数的大门,外面的那个指针可是一点儿都不知道里面发生了什么。
要是你想让这个改变也影响到函数外面,就得在调用函数的时候用 &栈 这样子,然后在函数里用 *值 = 新地址 来搞定,这样出来后,外面的 栈 就会指向新的地址了。
修正后的代码里,你是通过返回新的栈地址,然后在函数外面再把它赋给 值,这招挺机智的,确保了一切都按你的预期走。
至于那个 “return 操作改变了我传入的一级指针参数” 的问题,其实啊,return 它自己是不会去改变啥的,它只是负责返回值。如果你发现指针变了,那改变肯定是在你函数里对指针做的手脚。
所以呢,你现在这样,通过返回新的指针,然后在外头更新它,这操作没毛病,挺适合管理栈这种动态的数据结构。
谢谢我想明白了,是我的栈模型的问题,
传入的是栈顶指针,所以函数内在栈操作时改变了栈顶,函数外部不知道我改变了栈顶,所以原栈顶指向位置已经不存在了,从而丢失栈的地址
因为我在尝试使用c语言编写,所以手动把&引用改写成了二级指针,是我考虑不周