数据结构——栈和队列

栈的基本概念

栈的定义

栈(Stack)是只允许在一端进行插入或删除操作的线性表

  • 栈顶:允许插入或删除的一端
  • 栈底:不允许插入或删除的一端
  • 空栈:没有元素的栈

栈的操作特点:后进先出(LIFO)

栈的基本操作

InitStack(&S):初始化栈。构造一个空栈 S,分配内存空间。
DestroyStack(&S):销毁栈。销毁并释放栈 S 所占用的内存空间。

Push(&S,x):进栈,若栈S未满,则将x加入使之成为新栈顶。
Pop(&S,&x):出栈,若栈S非空,则弹出栈顶元素,并用x返回。
GetTop(S, &x):读栈顶元素。若栈 S 非空,则用 x 返回栈顶元素

其他常用操作:
StackEmpty(S):判断一个栈 S 是否为空。若S为空,则返回true,否则返回false。

卡特兰数

n个不同元素进栈,出栈元素不同排列的个数为
在这里插入图片描述

顺序栈

顺序栈的定义

#define MaxSize 10		    //定义栈中元素最大个数
/*顺序栈的定义*/
typedef struct{
   
	int data[MaxSize];	   //静态数组存放栈中元素
	int top;			   //栈顶指针
}SqStack;

顺序栈的初始化

初始top指针指向-1

/*初始化top=-1*/
void initSqStack(SqStack &S){
   
	S.top = -1;				//初始化栈顶指针
}

初始top指针指向0

/*初始化top=0*/
void initSqStack(SqStack &S){
   
	S.top = 0;				//初始化栈顶指针
}

顺序栈的判空

初始top指针指向-1

/*判空top=-1*/
bool isEmpty(SqStack S){
   
	if(S.top == -1)		
		return true;	//栈空
	else
		return false;	//不空
}

初始top指针指向0

/*判空top=0*/
bool isEmpty(SqStack S){
   
	if(S.top == 0)		
		return true;	//栈空
	else
		return false;	//不空
}

顺序栈进栈

初始化S.top = -1时

/*进栈(初始化S.top = -1)*/
bool Push(SqStack &S, int x){
   
	if(top == MaxSize -1)
		return false;		//栈满,报错
	S.top = S.top + 1;	
	S.data[S.top] = x;
	//以上两语句等价于S.data[++S.top] = x;
	return true;
}

初始化S.top = 0时

/*进栈(初始化S.top = 0)*/
bool Push(SqStack &S, int x){
   
	if(top == MaxSize)
		return false;		//栈满,报错
	S.data[S.top] = x;
	S.top = S.top + 1;	
	//以上两语句等价于S.data[S.top++] = x;
	return true;
}

顺序栈出栈

初始化S.top = -1时

/*出栈(初始化S.top = -1)*/
bool Pop(SqStack &S, int &x){
   
	if(S.top == 1)	
		return false;	//栈空,报错
	x = S.data[S.top];
	S.top = S.top - 1;
	//以上两语句等价于x = S.data[S.top--];
	return true;
}

初始化S.top = 0时


/*出栈(初始化S.top = 0)*/
bool Pop(SqStack &S, int &x){
   
	if(S.top == 0)	
		return false;	//栈空,报错
	S.top = S.top - 1;
	x = S.data[S.top];
	//以上两语句等价于x = S.data[--S.top];
	return true;
}

顺序栈读栈顶元素

初始化S.top = -1时

/*读栈顶元素(初始化S.top = -1)*/
bool GetTop(SqStack S, int &x){
   
	if(S.top == -1)
		return false;	//栈空,报错
	x = S.data[S.top];	//x记录栈顶元素
	return true;
}

初始化S.top = 0时

/*读栈顶元素(初始化S.top = 0)*/
bool GetTop(SqStack S, int &x){
   
	if(S.top == -1)
		return false;	//栈空,报错
	x = S.data[S.top - 1];	//x记录栈顶元素
	return true;
}

共享栈

共享栈:两个栈共享一片内存空间,两个栈从两头向中间增长
定义

#define MaxSize 10 //定义栈中元素个数的最大值
typedef struct{
   
	int data[MaxSize];	//静态数组存放栈中元素
	int top0;	//0号栈栈顶指针
	int top1;	//1号栈栈顶指针
}ShStack;

初始化

void initShStack(ShStack &Sh){
   
	Sh.top0 = -1;	  //初始化0号栈的栈顶指针
	Sh.top1 = MaxSize;//初始化1号栈的栈顶指针
}

判满

bool isFull(ShStack Sh){
   
	if( top0 + 1 =
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值