用浅显的话语来讲述栈这种数据结构

一、栈的基本概念

1、栈的定义
       栈是一种只能在一端进行插入或删除操作的线性表。其中允许进行插入或者删除操作的一端叫做栈顶,另一端叫做栈底。栈的插入和删除操作称为入栈和出栈。
2、栈的特点
       从栈的定义可以看出,栈只允许在栈顶进行插入删除操作,这就决定了栈**先进后出(FILO)**的特点。并且,当有n个元素以某种顺序进栈,并且可以任意出栈,其所获得元素排列的数目S满足
3、栈的存储结构
       栈可以根据存储结构分为两种:顺序栈和链式栈。

二、顺序栈和链式栈的操作

1、顺序栈

//结构体的定义
typedef struct{
	int data[maxSize]; //存放栈中元素,maxSize是已定义常量
	int top;  //栈顶指针
}SqStack;顺序栈类型定义

//初始化
void initStack(SqStack &st){
	st.top = -1;//只需要将栈顶指针置于-1,这样第一个元素就是从0下标开始
}

//判断是否为空栈
int isEmpty(SqStack st){
	if(st.top == -1){
		return 1;//空
	}else{
		return 0;
	}
}

//进栈
int push(SqStack &st,int x){
	if(st.top == maxSize -1){//判断是否满栈
		return 0;
	}
	++(st.top);//移动指针,再进栈
	st.data[st.top] = x;
	return 1;
}

//出栈
int pop(Sqstack &st,int &x){
	if(st.top == -1){//栈空则不出栈
		return 0;
	}
	x = st.data[st.top];//取出元素,再移动指针
	--(st.top);
	return 1;
}

2、链式栈
       我感觉和顺序栈差不多,你只要把顺序表和链式表搞清楚,这里就很简单,可以移步我的另一篇讲线性表的废话文

//结构体定义
typedef struct LNode{
	int data; //数据域
	struct LNode *next;//指针域
}LNode;

//初始化
void initStack(LNode *&st){
	lst = (LNode*)malloc(sizeof(LNode));//制造一个头结点
	lst ->next = NULL;
}

//判断栈空只需要判断lst ->next == NULL就可以了

//进栈
void push(LNode *lst, int x){
	LNode *p;
	p = (LNode*)malloc(sizeof(LNode));//制造一个头结点
	p ->next = NULL;
	//链表头插法
	p->data = x;
	p->next=lst->next;
	lst->next = p; 
}

//出栈
int pop(LNode *lst, int &x){
	LNode *p;
	if(lst->next == NULL){//空栈则无法出栈
		return 0;
	}
	//链表的删除
	p = lst->next;
	x = p->data;
	lst ->next = p->next;
	free(p);
	return 1;
}

三、栈的应用

       栈的应用实在是太多了,什么匹配啦,乱七八糟的都可以用栈来解决,感觉出题最多的是符号匹配,至于代码,自己百度吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值