C语言数据结构之栈详细解析

栈本身也是一种线性表,只是它只允许在一端进行插入和删除,栈结构的元素满足先进后出(LIFO)的特征。线性表本身分为顺序表和链表,所以栈也分为顺序栈和链栈。

1.顺序栈

顺序表声明的时候需要指明顺序表的最大容量,同样,顺序栈也需要。
通常习惯的做法是以top=0表示空栈(在《王道数据结构》中以top=-1表示,在严蔚敏老师的《数据结构中》是以top=0表示空栈)鉴于C语言的下标从0开始,则当以C语言做描述语言时,如此设定会带来很大的不便,另一方面,栈在使用的过程中,所需要的空间的大小很难估计,因此,一般来说在初始化栈的时候,不应限定最大容量,一个较为合理的做法是:先为栈分配一个基本容量,然后在应用过程中,当栈的空间不够使用时再逐步扩大,为此可设定两个常亮STACK_INIT_MAXXIZE(存储空间的初始分配量)和STACK_INCREMENT(存储空间分配增量)
顺序栈图示(栈顶指针始终指向栈顶元素的下一个位置
顺序栈图示
顺序栈结构体

#define maxsize 50
typedrf struct{
ElemType *base;				//栈底指针
ElemType *top;				//栈顶指针
int stacksize;				//栈的容量
}Sqstack;

初始化栈

int STACK_INIT_SIZE;										//初始化栈的时候分配的空间数,需要给一个初始值
bool InitStack(Sqstack &s){
s.base=(Sqstack *)malloc(sizeof(Sqstack)*STACK_INIT_SIZE);  //分配内存空间
if(!s.base)													//分配失败
		retuen false;
	s.top=s.base;											//栈为空时,栈应满足栈底和栈顶指针指向同一位置
	s.stacksize=STACK_INIT_SIZE;							//此时栈的容量就是初始化的空间数
	retuen true;
}

取栈顶元素:

bool GetTop(Sqstack s,Elemtype &x){
	if(s.top==s.base)		//栈为空
		retuen false;
	e=*(s.top-1); 			//栈的栈顶指针始终处于栈顶元素的下一个位置
	retuen true;
}

入栈:

int STACKINCREMENT; 			//扩充栈空间是的一个扩充量,需要给一个初始值
bool Push(Sqstack &s,ElemType e){
	if(s.top-s.base>s.stacksize||s.top==s.base){						//空间不足
		s.base=(ElemType *)ralloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(Sqstack))	
							//扩充STACKINCREMENT个空间
if(!s.base)
	return false;
s.top=s.base+s.stacksize;			//改变栈顶指针的位置到初始化最大值位置
s.stacksize+=STACKINCREMENT;		//栈的容量在原基础上增加了STACKINCREMENT个空间
}
*s.top++=e;  //元素先入栈,再加指针
return true;
}

出栈:

bool pop(Sqstack &s,ElemType &e){
	if(s.top==s.base)								//若为空栈,则直接退出
		return false;
	e=*--s.top;        //先减指针,再减元素
	return true;
}

链栈:

采用链式存储的栈,链栈不存在栈满上溢的情况,采用单链表的形式实现,并规定所有的操作都是在单链表的表头进行,链栈没有头结点。

链栈的结构体:

typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*Linklist;

入栈:链表头插法
出栈:删除链表的第一个节点

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值