#define MaxSize 50
typedef struct{
Elemtype data[MaxSize];
int top; //栈顶指针
}SqStack;
栈顶指针:
S.top,初始化设置S.top=-1
,栈顶元素:S.data[S.top]
判断栈为空的条件: S.top==-1
;
判断栈满的条件: S.top==MaxSize-1
;
栈长度: S.top+1
;
1.初始化:
void initStack(SqStack &S){
S.top=-1; //初始化栈顶指针
}
2.判空:
bool StackEmpty(SqStack S){
if(S.top==-1) return true;//栈空
return false;
}
3.出栈:
bool pup(Stack &S,ElemType &x){ //都是引用
//1.元素为空false
if(S.top==-1) return false;
//2.否则pop->x=S.data[S.top--];
x=S.data[S.top--];
return true;
}
4.进栈:
bool Push(SqStack &S,ElemType x){
if(S.top==MaxSize-1) return false;
S.data[++S.top]=x;
return true;
}
两个顺序栈共享一个一维数组空间,两个栈的栈底分别设置为共享空间的两端
为空的判断:
top0=-1
top1=MaxSize
为满的判断:
top1-top0=1
存储类型描述:
typedef struct LinkNode{
ElemType data;
struct Linknode *next;
}*LiStack;
优点: 便于多个栈共享存储空间,且不存在栈满上溢的情况;
1,2
8,9
**8:**最不适合作为链栈的选项是D. 没有表头指针的单向循环链表
。
链栈
是使用链表
来实现的栈结构,其中每个节点包含一个元素
和一个指向下一个节点
的指针
。由于栈是一种后进先出(LIFO)的数据结构,所以在栈结构中,所有的操作都是在栈顶
进行的。
选项A、B和C描述了双向循环链表,这些链表具有指向表头和表尾的指针,可以方便地在头部和尾部进行操作。虽然它们不是典型的链栈实现,但仍然可以通过在表头进行操作来模拟栈的行为。
然而,选项D描述的是没有表头指针的单向循环链表。由于栈操作需要在表头进行,而没有表头指针的单向循环链表无法方便地在表头进行插入和删除操作,因此最不适合作为链栈的选项是D。
9:
应该执行选项D. x=top->data; top=top->next。
在链栈中,top
指针指向栈低元素
。执行Pop
操作时,需要将栈顶元素弹出
,同时将其值存储在变量x中。
选项A将top指针指向下一个节点,但没有将出栈的元素值存储在x中。
选项B只是将top指针的data域赋值给x,但没有更新top指针。
选项C先将top指针指向下一个节点,然后尝试获取新的栈顶元素的值,但没有将其存储在x中。
选项D首先将top指针的data域赋值给x,然后再将top指针指向下一个节点,正确地完成了Pop操作,并将出栈的元素值存储在x中。因此,选项D是正确的答案。
11,12,13:
第11题:
每确定一种元素,其余两个位置算2,所以2*3=6种
第12题:
不可能出现cab的pop顺序,b肯定在a前面
第13题:
D;
采用共享栈的好处是D. 节省存储空间,降低发生下溢的可能。
共享栈是两个栈共享一段连续的内存空间,因此相比于两个独立的栈,共享栈可以节省一部分存储空间
。此外,共享栈可以通过控制两个栈顶
在中间相遇
来区分两个栈的空间
,因此在使用时需要进行一定的判断,这可以降低发生下溢
的可能。
22:注意队列是先进先出,所以并不会影响S栈,所以我们判断S栈种元素的pop即可,假设有3层:1.放入a,b;2.pop(b);3.c,d放入;4.d,c被pop;5.e和f放入,然后pop出来,然后将a pop,放入g ,再pop
I. 尾递归可以直接使用循环
II.确定了入桟次序
,不能确定出栈次序
IV.栈是一种受限的线性表,允许在其一端
(栈顶)进行操作