3.1栈

3栈

定义:(Stack)只允许在一端进行插入或者删除的线性表。

栈顶(Top):栈中允许插入和删除的那一端。

栈底(Bottom):固定,不允许进行插入和删除的那一端。

特点:

@栈是受限的线性表,所以自然具有线性关系。

@栈中元素后进去必然先出来,即后进先出LIFO(Last In First Out )

[外链图片转存失败(img-QeD24Ymt-1566050602453)(C:\Users\liuhao\AppData\Roaming\Typora\typora-user-images\1566046630758.png)]

栈的顺序结构:

栈是线性表的特例,那站的顺序存储也是线性表顺序存储的简化。栈的顺序存储结构也叫做顺序栈。

区别:

顺序表是用数组实现的,故栈的顺存储也可以用数组,但是栈是受限的线性表,所以顺序栈需要在顺序表的基础上做点修改。故将数组的第一个位置作为栈底不做变化,数组末尾的数可以无限延伸,作为栈顶。

结构:

#define  	MaxSize 50 //定义栈中元素的最大个数
typedef struct
{
	ElemType data[MaxSize];  //栈中存放的数据
	int top;			//栈顶
}SqStack;			//顺序栈的简写

[外链图片转存失败(img-vs6WsSJl-1566050602454)(C:\Users\liuhao\AppData\Roaming\Typora\typora-user-images\1566047182005.png)]

Note:

@Top值不能超过Maxsize。

@空栈的判定条件通常为Top==-1,栈满的判断条件通常为Top=Maxsize-1,栈中元素个数为Top+1。(具体题具体看,明白特点就好)

顺序栈的操作:

判空:

bool StackEmpty(SqStack S)
{
	if(s.top==-1)
	return true;
	else
	return false;
}

进栈:

bool Push(SqStack &S,Elemtype x)
{
	if(S.top == Maxszie-1)
	return false;
	S.data[++top]=x;
	return true;
}

出栈:

bool(SqStack &s,ElemType &x)
{
	if(S.top==-1)
	return false;
	x=S.data[S.top--]return true;
}

读取栈顶指针:

bool GetTop(SqStack,ElemType &x)
{
	if(S.top==-1)
	return false;
	x=S.data[top];
	return true;
}

共享栈:

原由:顺序栈的存储空间大小需要事先开辟好,很多时候每个栈各自单独开辟存储空间的利用率不如将各个栈的存储空间共享。

[外链图片转存失败(img-1dau65Ly-1566050602455)(assets/1566048336097.png)]

[外链图片转存失败(img-BlQV5mMs-1566050602456)(assets/1566048397704.png)]

栈满条件:指针Top1+1=Top2。

结构类型:

#define  	MaxSize 50   //定义栈中元素的最大个数
typedef struct
{
	ElemType data[MaxSize];  //栈中存放的数据
	int top1;			//栈1的栈顶指针
    int top2;			//栈2的栈顶指针
}SqDoubleStack;			//顺序共享栈的简写

操作:

进栈:

bool Push(SqDoubleStack &S, ElemType x, int stackNum)
{
	if(S.top+1==s.top+2) //栈满
	return false;
	if(stackNum==1)  //栈一有元素进栈
	S.data[++S.top1]=x;
	else if(stackNum==2)
	S.data[--S.top2]=x;
	return true;
}

出栈:

bool Pop(SqDoubleStack &S, ElemTypex x, int stackNum)
{
	if(stackNum==1)
	{
		if(S.top1==-1)
		return false;
		else
		x=S.data[top2--];
	}
	if(stackNum==2)
	{
		if(S.top2==-1)
		return false;
		else
		x=S.data[top2++];
	}
  return true;
}

链栈:

每个单链表都有头指针,对于栈来说,栈顶指针也是必须的。

可以将头指针当作栈顶指针,所以栈顶放在单链表的头部。

结点结构:

typedef stuct SNode
{
	ElemType data;
	struct SNode *next; //栈顶指针
}Snode,*SLink;
typedef struct LinkStack
{
	Slink top;
	int count;
}LinkStack;     //链栈

Note:

@链栈一般不存在栈满的情况。

@空栈的判定条件通常定位Top=NULL。

操作:

进栈:

bool Push(LinkStack *S,ElemType&x)
{
	Slink p=(SLink)malloc(sizeof(SNode));//为新结点申请空间
	p->data=x;    //赋值
	p->next=S->top; //将p的后继指向栈顶元素
	S->top=p;		//栈顶指针指向新元素
	S->count++;		//栈中元素个数加一
	return true;
}

出栈:

bool Pop((LinkStack *S,ElemType&x)
{
	if(S->top==NULL)
	return false;
	x=S->top->data;
	Slink p=S->top;
	S->top= S->top->next;
	free(q);
	S->count--;
	return true;
}

总结:
[外链图片转存失败(img-Vc2rOT2q-1566050602456)(assets/1566050564993.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值