顺序栈的类型声明
//顺序栈的类型声明
typedef struct {
ElemType data[MaxSize];//maxsize是元素个数的最大数,elemtype是元素类型,data是数组名
int top;//栈顶指针,存放栈顶元素在data数组中的下标
}SqStack;//顺序栈类型是sqstack
栈与顺序栈
- 采用顺序存储结构的栈称为顺序栈
- 栈到顺序栈可以直接映射
- 顺序栈是一块连续的存储空间
顺序栈的基本运算
//初始化栈
void InitStack(SqStack *&s){// ??*&是什么操作???,s指向这个栈
s = (SqStack*)malloc(sizeof(SqStack));//malloc分配空间,首地址放在s中
s->top = -1;//栈顶指针-1,表示当前栈空/初始化
}
//销毁栈
void DestroyStack(SqStack*& s) {
free(s);//释放顺序栈s占用的存储空间
}
//判断栈是否为空
bool StackEmpty(SqStack* s) {
return (s->top == -1);//“空”即:top=-1
}
//进栈
//先指针后元素
bool Push(SqStack*& s, int e) {//??为什么是bool型??
if (s->top == MaxSize - 1)//栈满,不能再进栈,“栈上溢出”
return false;
s->top++;//栈顶指针+1
s->data[s->top] = e;//s->top是数据,是一个下标,data[]是数组的某个元素,将新元素e放进栈顶指针top指向位置
return true;
}
//出栈
//先元素后指针
bool Pop(SqStack*& s, int &e) {
if (s->top == -1)//栈为空,不能出栈了,“栈下溢出”
return false;
e = s->data[s->top];//先将元素“还”给e
s->top--;//再将指针--,s是指针,所以->
return true;
}
//取栈顶元素
bool GetTop(SqStack*& s,int &e) {
if (s->top == -1)//栈为空时
return false;
e = s->data[s->top];//将元素还给e,但是不移动栈顶指针
return true;
}
顺序栈的基本运算小结
- 初始化:开辟空间+栈顶指针-1
- 进栈:先指针后元素
- 出栈:先元素后指针
- 销毁栈:一个free完事
- 取栈顶元素:只元素不指针
5个基本操作的时间复杂度均为O(1)
(无循环)
关于*&
*&表示指针的引用,**&表示指针的指针的引用
void pass_by_value(int* p)
{
//Allocate memory for int and store the address in p
p = new int;
}
void pass_by_reference(int*& p)
{
p = new int;
}
int main()
{
int* p1 = NULL;
int* p2 = NULL;
pass_by_value(p1); //p1 will still be NULL after this call
pass_by_reference(p2); //p2 's value is changed to point to the newly allocate memory
return 0;
}
上述代码中,value传递,形参只是*,函数调用不改变结果
reference传递,形参是*&,函数调用改变结果
顺序栈采用一个数组存放栈中元素
👇
当需要用到两个相同类型的栈时
可能出现: 一个栈一直装元素,另一个栈很空
如何解决: 共享栈
共享栈
目的: 有多个相同类型的栈时,防止一个很空一个很满
原理: 一个数组作为存储空间,但是有两个栈顶指针top1,top2
4个要素:
- 栈空:top1==-1;top2==maxsize;
- 栈满:top1==top2-1;//两个指针相邻了,不一定在中间
- 元素x进栈:先指针后元素
①进左边:top++;
②进右边:top–; - 元素x出栈:先元素后指针
Ⅰ左边出:top–;
Ⅱ 右边出:top++;
可以设计成结构体:
//若设计成结构体
//通过data,top1,top2标识
typedef struct {
ElemType data[MaxSize];
int top1, top2;
}DStack;
共享栈的基本运算
需要添加一个i形参,指明要操作的是左栈or右栈(i=1/2)
- 这里为什么用int top[2]={-1,maxsize};而不用int top1=-1,top2=maxSize;呢?
为了体现这两个栈底指针是属于一个共享栈的,我们习惯于用一个长度为2的数组表示它们,这样显得代码的可读性更强一点。
- 共享栈怎么入栈呢?
S1入栈:指针右移一个位置,即stack[++top[0]]=x;
S2入栈:指针左移一个位置,即stack[–top[0]]=x;
- 什么时候栈满呢?
两个栈顶指针重合时,表示共享栈已经满了