(三)顺序栈的代码实现

顺序栈

因为在C语言中学过链表,我就不仔细讲了,(主要是不想再学一遍哈哈)直接从栈与队列开始吧!


一、栈是什么?

栈是一种后进先出的数据结构。例如:游览器,每点击一次后退都是退回到最近一次游览的网页。关键点:
1.栈的元素必须先进后出。
2.站的操作只能在这个线性表的表尾进行。
3.对于栈,表尾称为栈的栈顶(top)表头称为栈底。

二、栈的基本操作函数实现

typedef int ElemType
typedef struct {
	ElemType* base;
	ElemType* top;
	int stacksize;
}sqStack;

首先我们先用typedef来给我们的数据类型起一个别名,这样代码就具有通用性。
然后定义一个结构体,base是栈底指针,top是栈顶指针,stacksize是当前站的容量。
为什么我要这样创建一个栈,而不是直接定义一个数组去实现栈,这样不是更好实现吗?确实更好实现,但是我这样定义的一个好处就在于这样直接操作指针,更方便计算机操作。

1.初始化操作,建立一个空栈

代码如下(示例):

#define STACK_INIT_SIZE 100
int Init_Stack(sqStack* s)
{
	s->base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));
	if (!s->base)
		return ERROR;
	s->top = s->base;//最开始栈底就是栈顶
	s->stacksize = STACK_INIT_SIZE;
	return 0;
}

顺序栈我们就要给栈一个连续的空间,就需要用malloc给栈分配一个连续的空间,然后判断栈的空间是否分配成功,再给栈的栈顶指针赋值,栈的容量赋值,这样就成功创建了一个栈。

2.入栈操作(push)

代码如下(示例):

#define STACKINCRINREMENT 10//每次增加的容量
//若栈s存在,则插入e到s中并成为栈顶元素
int Push(sqStack* s, ElemType e)
{
	if (s->top - s->base >= s->stacksize)
	{
		s->base = (ElemType*)realloc(s->base ,s->stacksize + STACKINCRINREMENT);
		s->top = s->base + s->stacksize;
		s->stacksize += STACKINCRINREMENT;
	}
	*(s->top) = e;
	s->top++;
	return OK;
}

首先判断这个栈是否满了,这里我们使用realloc这个函数实现栈的动态存储,如果有不懂的可以看看这位大神的文章:
realloc()用法详解
当然最重要的就是判断之后的操作啦,将e插入到栈顶,再将栈顶指针上移。

3.出栈操作

//删除栈顶元素并用e返回其值
int Pop(sqStack* s, ElemType* e)
{
	if (s->top == s->base) 		return ERROR;
	*e = *(s->top);
	s->top--;
	return OK;
}

第一步判断栈是否为空,当然也可以直接这样判断;

if(s->stacksize == 0) return EROOR;

然后将栈顶元素的值赋给e,再将栈顶指针下移。

总结

上面就是栈的一些主要操作哦,其实还有清空栈、销毁一个栈、判断栈是否为空、获取栈顶元素、获取栈的长度等等。这里就不一一详细说了,有兴趣的朋友可以和我讨论一下。我觉得这里最难的就是指针的问题,难住了我很久,如果大家看不懂的话就去先学学指针吧!
第三天了,冲冲冲!嘿嘿

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小光学嵌入式

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值