顺序栈(C语言)

1.定义

顺序栈是一种简单且常见的数据结构,常用于解决需要后进先出(LIFO)操作的问题,如递归函数调用、表达式求值、历史记录的管理等。由于其基于数组实现,栈的大小通常受限,所以在使用顺序栈时需要谨慎管理栈的容量,以避免栈溢出的情况。

2.顺序栈的定义包括以下几个关键要素:

  1. 存储结构:顺序栈使用数组作为其基本存储结构。这个数组通常是一个连续的内存块,可以容纳一定数量的元素。

  2. 栈顶指针:顺序栈使用一个指针来标识栈顶元素的位置。这个指针通常指向数组中最顶部的元素,或者指向栈顶元素上方的一个空位置,以便插入新元素。

  3. 栈的大小限制:顺序栈的大小通常是固定的,由数组的容量决定。一旦栈满,就无法再插入新的元素,除非进行一些特定的操作来扩展栈的容量。

3.基本操作:顺序栈通常支持以下基本操作:

  • 入栈(Push):将元素放入栈顶,同时更新栈顶指针。
  • 出栈(Pop):从栈顶移除元素,同时更新栈顶指针。
  • 获取栈顶元素(Top):返回栈顶元素的值,但不移除它。
  • 判空(Empty):检查栈是否为空。
  • 判满(Full):检查栈是否已满。
  • 获取栈的大小(Size):返回栈中元素的数量。

示意图:

特点:

1.栈顶指针通常指向栈顶元素上方的位置,或者指向栈顶元素本身。当进行入栈操作时,栈顶指针向上移动以指向插入的新元素。当进行出栈操作时,栈顶指针向下移动以移除栈顶的元素。

2.先进后出,后进先出。

案例:

1.1:初始化:创建一个空的数组,用来作为顺序栈


typedef int DataType;


typedef struct
{
	DataType *data; /* 堆空间 */
	int maxsize;
	int top;		/* 栈顶指针 */
}SeqStack;

/* 1. 初始化 */
int init(SeqStack *S, int MaxSize);
/* 1. 初始化 */
int init(SeqStack *S, int MaxSize)
{
	/*申请内存空间*/
	S->data = (DataType*)malloc(sizeof(DataType)*MaxSize);

	if(!S->data)
	{
		printf("内存申请错误,初始化失败![10001]\n");
		return 10001;
	}
	S->maxsize = MaxSize;
	S->top = -1;
	return 0;
}

运行图:

2.入栈:它用于将一个新元素添加到栈顶

有两个步骤:

2.1:首先判断栈是否已满

2.2:若栈未满,则将要入栈的元素放入数组中top的下一个位置,并将top加1。


/* 2. 进(入)栈 */
int push(SeqStack *S, DataType x);
/* 2. 进(入)栈 */
int push(SeqStack *S, DataType x)
{
	/*是否满?*/
	if(full(S))
	{
		printf("栈已满!10002\n");
		return 10002;
	}

	S->top++;			/*移动指针*/
	S->data[S->top] = x;/*放入数据*/
	return 0; /*OK*/
}

运行图:

运行图:

3.出栈:用于移除栈顶的元素。

有两个步骤:

3.1:首先判断栈是否为空

3.2:若栈非空,则将栈顶的元素取出,并将top减1。

/* 3. 出栈 */
int pop(SeqStack *S, DataType
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

与风过山岗

您的鼓励是我莫大的荣幸

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值