C语言新手求教栈PUSH算法中TOP初始化及代码溢出问题
栈PUSH算法的TOP初始化与代码修正
TOP的正确初始化
栈的TOP变量用来标记当前栈顶元素的下标,标准初始化方式是设为-1,表示此时栈为空:
- 栈空时
TOP=-1,执行PUSH操作时先检查TOP是否等于MAXSIZE-1(栈满状态),若是则触发溢出; - 执行
TOP++后变为0,正好对应数组第一个下标,将元素存入STACK[0],完全匹配你提供的算法步骤。
你的代码存在的核心问题
局部变量
top未初始化且无法保存状态
你在push函数里定义的int top;是局部变量,每次调用函数都会重新分配内存,值为随机垃圾值,第一次判断就大概率触发溢出逻辑。而且局部变量无法在多次调用push时跟踪栈的当前状态,必须把top定义为全局变量,或者通过指针传递给push函数。函数参数与数组访问语法错误
- 参数
int(*stack)[item]写法错误,item是函数参数,不能用来定义数组指针的维度; - 访问数组指针元素时,
*stack[top]优先级错误,应该写成(*stack)[top]——因为[]优先级高于*,原写法会先访问stack[top],不符合你访问数组元素的需求。
- 参数
栈初始状态不符合逻辑
main函数里初始化arr[4] = {0 , 1, 2, 3}相当于栈已经被填满,但按照栈的逻辑,初始应该是空栈,TOP=-1,数组的初始值可设为0,但有效元素由TOP标记的位置决定。
修正后的代码示例
方案一:使用全局变量保存TOP
#include <stdlib.h> #include <stdio.h> #define MAXSIZE 4 // 定义栈的最大容量 int top = -1; // 全局变量保存栈顶位置,初始化为-1表示空栈 int push(int item, int stack[]) { // 检查栈溢出 if (top == MAXSIZE - 1) { printf("Overflow"); return -1; } top++; stack[top] = item; // 返回当前栈顶元素 return stack[top]; } int main(void) { int arr[MAXSIZE] = {0}; // 初始化空栈,元素初始为0 int itm = 2; int result; result = push(itm, arr); printf("\nResult: %i", result); // 输出2,此时top=0,arr[0]=2 // 测试第二次push itm = 5; result = push(itm, arr); printf("\nResult: %i", result); // 输出5,此时top=1,arr[1]=5 return 0; }
方案二:通过指针传递TOP(避免全局变量)
#include <stdlib.h> #include <stdio.h> #define MAXSIZE 4 int push(int item, int stack[], int *top) { if (*top == MAXSIZE - 1) { printf("Overflow"); return -1; } (*top)++; // 注意括号,++优先级高于*,必须加括号保证先取top的值再自增 stack[*top] = item; return stack[*top]; } int main(void) { int arr[MAXSIZE] = {0}; int top = -1; // 局部变量,通过指针传递给push函数 int itm = 2; int result; result = push(itm, arr, &top); printf("\nResult: %i", result); itm = 5; result = push(itm, arr, &top); printf("\nResult: %i", result); return 0; }
内容的提问来源于stack exchange,提问作者Emil11
相关产品推荐
相关产品推荐

