数据结构复习(三)栈+队列(栈)

栈的定义

只允许在一端进行插入/删除的线性表
栈顶线性表允许进行插入/删除的那一端
栈底固定的,不允许进行插入/删除的一端
空栈不含任何元素的空表
n个元素有(1/n+1)C2n n种排列个数

栈的顺序存储结构

–增删改查O(1)

初始化

#define MaxSize = 50
typedrf struct {
	ElemeType data[MaxSize];
	int top;
}SqStack;

空栈条件:S.top==-1
满栈条件:S.top=MaxSize-1
栈长: S.top+1

以下定义中,top指针指向栈顶元素本身

新元素入栈

bool Push (SqStack &S,ElemType x){
	if(S.top == MaxSize-1):
		reurn false;
	else:
		S.top = S.top+1;
		S.data[S.top]=x;//等价于 S.data[++S.top]=x
		return true;
}

出栈

bool popStack(ElemType &x,SqStack &S){
	if(S.top == -1)
		return false;
	else:
		x=S.data[S.top -1];//将x指向栈中data=x的元素
		S.top =S.top-1;//等价于x=S.data[S.top --]
		return true;
}

读栈顶元素

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

当top指向栈顶元素的下一个元素的时候

进栈操作

bool PushStack(ElemType &x,SqStack &S){
	if (S.top ==MaxSize)
		return false;
	else:
		S.data[S.top]=x;
		S.top =S.top+1;//等价于S.data[++S.top]=x;
		return true;
}

出栈

bool PopStack(ElemeType & x,SqStack & S){
	if (S.top ==0):
		return false';
	S.top = S.top-1;//top指针要指向栈顶元素本素
	x=S.data[S.Top];//等价于x=S.data[--S.top]
}

共享栈

让两个顺序栈共享一个数组,数组两端分别作为两个顺序栈的栈底,两个顺序栈向数组中间延展

#define MaxSize 10
typedef struct{
	ElemType data[MaxSize];
	int top0;
	int top1;
}ShStack;

初始化共享栈

(设top指向栈顶元素

(以下也对应着两端栈判空条件

分别有 top0 和 top1在数组两端

void InitStack(ShStack &S){
	S.top0=-1;
	S.top1=MaxSize;
}
两端判断满栈的条件
top1-top0==1
top0的栈入栈时

x=S.data[ ++S.top0]

top0出栈时

x=S.data[S.top0 --]

top1的 栈入栈时

x=S.data[–S.top1]

top1的栈 出栈时

x = S.data[++S.top1]

栈的链式存储结构

优点

1.不会出现栈满溢的状况
2.多个栈共享存储空间
3.提高效率

规定用链表实现,且操作都在表头进行,入栈==头插法的链表

Lhead 指的是栈顶元素,此处认为没有头结点

typedef struct Linknode{
	ElemeType data;
	struct Linknode *next;
}*LiStack;
初始化
bool InitLinkStack(LinkStack & stack){
	if(stack==NULL):
		return false;
	stack->top=NULL;
	stack->count=0;
	return true;
}

进栈

//压栈:先将压入元素放入到链表表中,然后再将栈顶指针指向压入的元素,然后count+1.
bool push(LinkStack& stack,ElemType e)
{
	if (!stack)
	{
		return false;
	}
	StackNode* node = (StackNode*)malloc(sizeof(StackNode));
	node->next = stack->top;           //将元素加入链表中,使node的next指针指向原来的栈顶
	node->data = e;					   //设置node的data
	stack->top = node;                 //设置新的栈顶,栈顶元素指向压入元素
	stack->count++;					   //增加长度
	return true;
}

出栈

bool popStack(LinkStack & stack, ElemeType &e){
	if(stack ==NULL):
		return false;
	Stack& node = stack->top;//先定义一个node
	& e = node->data;	     //将e指向node的data
	stack->top = node->next; //设置新的top顶元素
	free(node);				 //释放原来的top即node
	stack->count--;			 //将栈的长度-1
	return true;				
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值