1. 必会口诀
栈(LIFO):“先进后出,就像叠盘子,最后放的最先拿。”
队列(FIFO):“先进先出,就像排队,先来的先走。”
出入规则:“栈顶进出,队尾进队头出,这个千万别搞混。”
2. 答题技巧 & 蒙题套路
选择题问“不可能的出栈顺序”:直接套“任意元素后面出栈的必须按入栈逆序排列”。比如入栈是1、2、3、4,看到选项里4后面跟着的是2、1、3,3没按逆序(应该是3、2、1),直接划掉。
循环队列判空/判满:
套路公式:队头指针 `front`,队尾 `rear`,总大小 `N`。
队列空:`front == rear`
队列满(通用套路):`(rear + 1) % N == front`
蒙题时,题干如果给了具体数字,套公式算一下最稳。
中缀转后缀表达式(选择题常客):
口诀:“从左到右扫描,数字直接输出,运算符看栈顶,优先级高入栈,低(或等)则弹出栈顶再比。”
拿不准优先级顺序就记:“括号最高,乘除次之,加减最低”。
3. 硬核知识点清单(背就完事)
栈的核心操作:
`Push`(入栈) -> 栈顶插入。
`Pop`(出栈) -> 栈顶删除并返回。
`GetTop`(取栈顶) -> 只看不删。
队列的核心操作:
`EnQueue`(入队) -> 队尾插入。
`DeQueue`(出队) -> 队头删除并返回。
两种存储结构:
顺序存储:数组实现。栈要有个 `top` 指针;队列要 `front` 和 `rear` 指针,循环队列必考。
链式存储:链表实现。链栈通常用单链表(头插法就是 `Push`,头删就是 `Pop`);链队列需要头、尾两个指针。
应用场景(简答题救命点):
栈:函数调用、递归、表达式求值/转换、括号匹配、浏览器前进后退。
队列:任务调度(如打印机)、消息队列、树的层次遍历、CPU进程就绪队列。
4. 真题答案常考模板
写一个循环队列入队算法(C语言风格):
int EnQueue(SqQueue &Q, ElemType e) {
if ((Q.rear + 1) % MAXSIZE == Q.front) // 队满判断
return ERROR;
Q.data[Q.rear] = e;
Q.rear = (Q.rear + 1) % MAXSIZE; // rear指针循环后移
return OK;
括号匹配判断(栈的应用模板):
思路:“左括号全入栈,遇到右括号就弹栈顶看是否匹配。最后栈空才算匹配成功。”
5. 区别对比 & 大实话坑点
栈 vs 队列的核心差别:插入删除位置不同。栈只在一头(顶)操作,队列严格两头操作。
顺序栈 vs 顺序队列的坑:
栈:`top`指向栈顶元素或下一个空位都行,题目说清楚就行。
队列:普通顺序队列有“假溢出”问题,所以必须用循环队列。坑点在于:循环队列为判满会牺牲一个存储单元,或者单独加个`tag`标志位。做题先看题目怎么约定的。
有用吗?含金量咋样?
大实话:数据结构是计算机的底层内功,栈和队列是最基础的两种逻辑结构。专升本考试这是必拿分基础题,工作里写代码、理解系统(比如递归爆栈、消息队列)天天用。这块分拿不到,后面树、图更晕。