3.1.2 栈的顺序存储实现
约 40 分钟
3.1.2 顺序栈:top 的语义必须从头到尾一致
顺序栈用连续数组保存元素。常见约定一:top=-1 表示空栈,top 指向当前栈顶元素;入栈先 ++top 后写入,满栈条件 top==CAP-1。约定二:top=0 表示空栈,top 指向下一个可写位置;入栈先写 data[top] 再增,满栈条件 top==CAP。两种都对,混用才错。
typedef struct { int data[100]; int top; } Stack;
int push(Stack *s,int x){ if(s->top==99)return 0; s->data[++s->top]=x; return 1; }
int pop(Stack *s,int *x){ if(s->top==-1)return 0; *x=s->data[s->top--]; return 1; }
入栈、出栈和读顶都只访问数组末端,时间 。固定数组可能溢出;动态数组可扩容,但一次扩容为 ,倍增策略使连续入栈均摊为 。
两个栈可共享一个数组:左栈从低地址向右长,右栈从高地址向左长。设 top1=-1, top2=CAP,满条件是 top1+1==top2。共享使空闲空间按实际需求分配,但两栈总元素数仍不能超过容量。
手工推演:容量 5,共享栈先左入 7、8,再右入 9、6,此时 top1=1,top2=3,仅下标 2 空闲;任一边再入一个元素后两顶相邻,满栈。
错解反馈:出栈先减 top 再取会漏掉原栈顶;用 top==CAP 判断约定一的满栈差一;共享栈用两套独立“满”条件会浪费中间空间。
迁移题:约定 top 指向下一个可写位置时,写出空、满、读顶表达式。答案依次为 top==0、top==CAP、data[top-1]。独立验收:能任选一种约定完整写出四个边界条件并通过空栈、单元素、满栈测试。
小纸条
单选:top=-1且指向栈顶,容量m的满栈条件是?A top==m B top==m-1 C top==0 D top+1==0
登录 后可看答案
Practice
本课练习
先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。
本课练习正在补齐,暂不应标记为完成。