数据结构|栈

顺序栈的类型声明

//顺序栈的类型声明
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个要素:

  1. 栈空:top1==-1;top2==maxsize;
  2. 栈满:top1==top2-1;//两个指针相邻了,不一定在中间
  3. 元素x进栈:先指针后元素
    ①进左边:top++;
    ②进右边:top–;
  4. 元素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;

  • 什么时候栈满呢?

两个栈顶指针重合时,表示共享栈已经满了
在这里插入图片描述

链栈

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值