【数据结构】栈的基本概念及基本操作

一、栈的定义

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

在生活中类似栈的情景有洗碗时碗的堆叠,烤串的连串

重要术语:

栈顶:允许插入和删除的一端

栈底:不允许插入和删除的一端

空栈:没有存数据元素的栈

 

 二、栈的顺序存储实现

2.1、顺序栈的初始化

#define MaxSize 10
typedef struct {
	ElemType data[MaxSize];   //静态数组存放栈中元素
	int top;		//栈顶指针
}SqStack;


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

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

void testStack() {
	SqStack S;     //声明一个顺序栈并分配空间
	InitStack(&S);
	StackEmpty(&S);
}

2.2、进栈操作

#define MaxSize 10
typedef struct {
	ElemType data[MaxSize];   //静态数组存放栈中元素
	int top;		//栈顶指针
}SqStack;


bool push(SqStack S, ElemType x) {
	if (s->top == MaxSize - 1)     //栈满,报错
		return false;
	S->top += 1;		//栈顶指针先+1
	S->data[S->top] = x;	//新数据写入栈顶
	return true;
}

2.3、出栈操作

#define MaxSize 10
typedef struct {
	ElemType data[MaxSize];   //静态数组存放栈中元素
	int top;		//栈顶指针
}SqStack;


bool out(SqStack S, ElemType* x) {		//出栈操作
	if (s->top == -1)     //栈空,报错
		return false;
	*x = S->data[S->top];	//指针变量x存储出栈的数据
	S->top--;
	return true;
}

2.4、读取栈顶元素

#define MaxSize 10
typedef struct {
	ElemType data[MaxSize];   //静态数组存放栈中元素
	int top;		//栈顶指针
}SqStack;


bool GetTop(SqStack S, ElemType* x) {		//读栈顶元素
	if (s->top == -1)     //栈空,报错
		return false;
	*x = S->data[S->top];	//指针变量x存储栈顶的数据
	return true;
}

三、栈的链式存储实现

链栈除了具有栈后进先出性质的外,其基本操作与链表类似,并且也有头结点与无头结点之分

 3.1、链栈的初始化

#define MaxSize 10
typedef struct LinkStack{
	ElemType data;				//链表的数据域
	struct LinkStack next*;		//链表的指针域
}LinkStack;


bool InitStack(LinkStack* L) {
	L = (LinkStack*)malloc(sizeof(LinkStack));
	if (L = NULL)
		return false;
	L->next = NULL;
	return true;
}

3.2、进栈操作

typedef struct LinkStack{
	ElemType data;				//链表的数据域
	struct LinkStack next*;		//链表的指针域
}LinkStack;


bool IndertStack(LinkStack* L, ElemType x) {		//进栈操作
	LinkStack* S = (LinkStack*)malloc(sizeof(LinkStack));  //创建结点S
	if (S == NULL)				
		return false;
	S->next = L->next;			//S的指针域指向L的后继结点
	L->next = S;				//L的指针域指向S
	S->data = x;				//S的数据域存储ELemType类型x
	return true;
}

3.3、出栈操作

typedef struct LinkStack{
	ElemType data;				//链表的数据域
	struct LinkStack next*;		//链表的指针域
}LinkStack;


bool outStack(LinkStack* L, ElemType* x) {		//出栈操作并返回值给x
	if (L == NULL)				//空栈时返回false
		return false;
	LinkStack* S=L->next;				//指针S指向出栈元素
	L->next = S->next;
	*x = S->data;
	free(S);
	return true;
}

3.4、读取栈顶元素

typedef struct LinkStack{
	ElemType data;				//链表的数据域
	struct LinkStack next*;		//链表的指针域
}LinkStack;


bool GetTop(LinkStack* L, ElemType* x) {		//读取栈顶元素并返回值给x
	if (L->next==NULL)				//栈顶无数据时返回false
		return false;
	*x = L->next->data;            //x接收栈顶数据
	return true;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值