数据结构——顺序栈的基本操作实现

 是限定仅在表尾进行插入操作或删除操作的线性表。因此,对栈来说,表尾有其特殊含义,称为栈顶 (top),相应地,表头端称为栈底(bottom)。不含元素的空表为空栈。

假设栈S=(a1,a2,...,an),则成a1为栈底元素,an为栈顶元素。栈中元素按a1,a2,...,an的次序进栈,退栈的第一个元素应为栈顶元素。换句话说,栈的修改是按后进先出的原则进行的(如图3.1(a)所示)。因此,栈又称为后进先出的线性表(简称LIFO结构),它的这个特点可用图3.1(b)所示的铁路调度站形象地表示。

      

 

 //========= ADT Stack 的表现与实现 ========

#include<stdlib.h>
#include<stdio.h>

/*

栈的顺序存储表示

*/


#define SElemType char
#define STACK_INIT_SIZE 100		//存储空间初始分配量
#define STACKINCREMENT 10		//存储空间分配增量

/*顺序栈的定义*/
typedef struct {
	SElemType *base;			//栈底指针,在构造之前和销毁之后,base的值为NULL
	SElemType *top;			//栈顶指针
	int stacksize;		//当前已分配的存储空间,以元素为单位
}SqStack;

/*基本操作函数*/

void InitStack(SqStack *s)		//构造一个空栈S
{
	s->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if (!s->base) printf("存储分配失败\n");	//存储分配失败
	s->top = s->base;
	s->stacksize = STACK_INIT_SIZE;
	printf("构建成功\n");
}

void DestroyStack(SqStack *s)	//销毁s
{
	//free(s);
	free(s->base);
	s->top = NULL;
	s->base = NULL;
	s->stacksize = 0;
	s = NULL;
	//	free(s);
}

void ClearStack(SqStack *s)		//把s置为空栈
{
	s->top = s->base;
}

int StackEmpty(SqStack *s)		//若栈s为空,返回1,负责返回0
{
	if (s->base == s->top) return 1;
	else return 0;
}

int StackLength(SqStack *s)		//返回s的元素个数,即栈的长度
{
	int lenth;//栈长
	lenth = (s->top - s->base);//?
	return lenth;
}

void GetTop(SqStack *s, SElemType *e)			//若栈不为空,则用e返回s的栈顶元素,并返回1,否则返回0
{
	if (s->top == s->base)	printf("空栈");
	else
		*e = *(s->top - 1);
}

void Push(SqStack *s, SElemType e)			//插入元素e为新的栈顶元素
{
	if (s->top - s->base >= s->stacksize)//栈满,追加存储空间
	{
		s->base = (SElemType *)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(SElemType));

		if (!s->base)	exit(1);	//存储分配失败

		s->top = s->base + s->stacksize;
		s->stacksize += STACKINCREMENT;
	}
	*s->top++ = e;
}

void Pop(SqStack *s, SElemType *e)		//若栈不空,则删除s的栈顶元素,用e返回其值,并返回1,否则返回0
{
	if (s->top == s->base)	printf("空栈");
	else	*e = *--s->top;
}

void visit(SElemType *base)
{
	printf("%d ", *base);
}
void StackTraverse(SqStack *s)		//从栈底到栈顶依此对栈的每个元素调用函数visit().一旦visit()失败,则操作失败
{
	while (s->base != s->top)
	{
		visit(s->base++);
	}
	printf("OK");
}

 

参考资料:《数据结构(C语言版)》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值