栈和队列【数据结构c语言版】(1)

限定仅在表尾插入或删除操作的线性表。
表尾称为栈顶,表头称为栈底
先进后出
插入元素为入栈,删除元素为出栈
在这里插入图片描述

一.基本操作

基本操作操作结果
InitStack(&S)构造一个空栈
DestroyStack(&S)销毁栈S
ClearStack(&S)将S清为空栈
StackEmpty(S)若S为空栈,返回True,否则返回False
StackLength(S)返回栈长,S个数
GetTop(S,&e)用e返回S 栈顶元素
Push(&S,e)插入元素e为新的栈顶元素
Pop(&S,&e)删除S栈顶元素并用e返回其值
StackTraverse(S,visit())从栈底到栈顶对S中每个数据调用visit

二.栈的表示和实现

和线性表类似,栈也有两种存储表示方法

2.1顺序栈

一组地址连续的存储单元依次存放从栈底到栈顶的元素
top元素指示栈顶元素在顺序栈中位置
以top=0表示空栈

2.1.1类型说明
typedef struct
{
	SElemType *base;//指向栈底
	SElemType *top;//栈顶指针
	int stacksize;//栈目前可使用的最大容量
 } SqStack;

top=base可作为栈空的标记
插入新的栈顶元素,top增1
在这里插入图片描述

2.1.2栈的顺序存储表示

#define STACK_INIT_SIZE 100;//存储空间初始分配量 
#define STACKINCREMENT 10;//存储空间分配增量 
typedef struct
{
	SElemType *base;//栈构造之前和销毁之后,base值为NULL
	SElemType *top;//栈顶指针
	int stacksize;//当前已分配到饿存储空间,以元素为单位
 } SqStack;

2.1.3基本操作

构造空栈

Status InitStack(SqStack &S)
{
	S.base=(SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if(!S.base)exit(OVERFLOW);
	S.top=S.base;
	S.stacksize=STACK_INIT_SIZE;
	return OK;
 } 

销毁栈

void DesTroy(SqStack &S)
{
	free(S.base);
	S.top=S.base=NULL;
	S.stacksize=0;
 } 

如果S 为空返回True,否则返回False

Status StackEmpty(SqStack S)
{
	if(S.top==S.base)return TRUE;
	else return FALSE;
}

用e返回栈顶元素,并返回OK,否则返回ERROR

Status GetTop(SqStack S,SElemType &e)
{
	if(S.base==S.top)return ERROR;
	e=*(S.top-1);
	return OK;
}

插入元素e为新的栈顶元素

Status Push(SqStack &S,SElemType e)
{
	if(S.top-S.base>=S.stacksize)//栈满,追加存储空间
	{
		S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
		if(!S.base)exit(OVERFLOW);
		S.top=S.base+S.stacksize;
		S.stacksize+=STACKINCREMENT; 
	} 
	
	*S.top++=e;//e入栈,栈顶上移 
}

若S不空,用e返回其值,并返回OK

Status Pop(SqStack &S,SElemType &e)
{
	if(S.base==S.top)return ERROR;
	e=*(--S.top);//栈顶元素赋给e,栈顶指针下移 
	return OK;
}

从栈底到栈顶,依次对每个元素调用函数visit()

void StackTraverse(SqStack S,void(*visit)(SElemType))
{
	SElemType *p=S.base;
	while(S.top>p) visit(*p++);
	printf("\n");
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值