概念和截图来自王道视频和PPT以及书本
栈
定义:只允许在一端进行插入或删除的线性表
栈顶:允许插入和删除的一端
栈底:不允许
先进后出
链栈
头插法建立链表对应进栈操作
将链头看作是栈顶
定义:
typedef struct Linknode{
ElemType data;
struct Linknode *next;
}*LiStack
链栈与链表一样,同样分为带头结点和不带头结点的两种。
王道课本上面建立用不带头节点的。
选择题错题记录
设链表不带头结点且所有操作均在表头进行,则下列最不适合作为链栈的是()
A:只有表头结点指针,没有表尾指针的双向循环链表
B:只有表尾结点指针,没有表头指针的双向循环链表
C:只有表头结点指针,没有表尾指针的单向循环链表
D:只有表尾结点指针,没有表头指针的单向循环链表
【分析】
A、B这两个都是双向循环链表,对于双向循环链表来说,知道了头指针或者是尾指针中的其一,都很容易找到另外的尾指针或者是头指针
D是有表尾指针没有表头指针的单向循环链表,则找到表头指针的代码为
head = tail->next
很容易找到表头指针。
C是有表头指针没有表尾指针的单向循环链表,只有表头指针需要找表尾指针时,需要遍历一遍,时间复杂度O(n)
选C
2.
链栈(不带头结点)执行POP操作,并将出栈的元素存在x中,则执行代码为:
3.
若一个栈的输入序列是P1,P2,~~~~Pn,输出序列是1,2,3,~ ~ ~n,若P3=1,则P1的值是
4.
已知一个栈的入栈顺序是1,2,3,4,其出栈序列是P1,P2,P3,P4,则P2,P4不可能是
5.
设栈的初始状态为空,当字符序列"n1_"作为栈的输入时,输出长度为3,且可用做C语言的标识符的序列有几个
【分析】C语言标识符的规则:
1.标识符必须以大小写英文字母或者下划线作为首字母。
2.标识符中只能包含大小写英文字母、数字、下划线,不允许出现如“ ! 、@、#、¥、%、^、&、*、(、)、/、?等其他标点,而且C语言中的标识符不能使用任何中文字符,包括汉字、中文标点。
3.标识符不能与c语言的保留字或者库函数名相同。
除以上三条外,在命名标识符时,还需要注意C语言对大小写敏感,因此,相同的字母的不同大小写是不同的标识符。
6.(2013统考真题)
一个栈的入栈序列是1,2,3…n,出栈序列是P1,P2,P3…Pn。若P2=3,则P3可能的取值的个数为
【分析】
首先分为两种情况:
- P3是3之后入栈的数:4、5…n
则有n-3中可能 - P3是3之前入栈的数:1或2
当P3=1时:1入、2入、2出、3出、1出
当P3=2时:1入、1出
、2入、3入、3出
、2出
综上:共n-3+2=n-1种取值
7.(2018统考真题)
我原本选的是A,按照 a op b来算了,没看清题目中说的是b op a
step1:3+2=5
step2:8-5=3
step3:5*3=15
最终答案15