Day 08顺序栈

基础概念

栈:一种特殊的线性表,特殊在于只能一端进行出入,先进后出(first in last out);先进去的后面出,后面进的先出;出入一端叫栈顶,另一端叫做栈底

既然是一种特殊的线性表,则有两种实现方式:顺序结构和链式结构

对栈插入数据:入栈,(压栈)

对栈删除数据:出栈(弹栈)

手枪弹夹

顺序栈:

入栈:顺序表的尾插

出栈:顺序表的尾删

唯一一点:把顺序表的结构体成员的名字换一下

base:栈底

top:顶指针

stacksize:最大容量

结构体设计

//可扩容的顺序表的结构体设计


#define STACK_INIT_SIZE 100 //初始大小
#define STACKINCREMENT 10 //不需要
typedef int ELEM_TYPE;

typedef struct Stack
{
	ELEM_TYPE* base;//存储空间基址(用来接收malloc返回在堆上申请的连续空间块开始地址)
	int top;//当前有效长度,且还可以表示下一个待插入位置的下标
	int stacksize;//当前总空间大小(以格子个数为单位)
}Stack, * PStack;

各功能实现

初始化
 

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"stack.h"

void Init_stack(struct Stack* st) {
	st->base = (ELEM_TYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEM_TYPE));
		st->top = 0;
	st->stacksize = STACK_INIT_SIZE;
}


图表分析

eb97cf00fe9a49749cae119692e63f18.png

 

入栈(队尾插入)
 



//入栈(队尾插入)
bool Push(struct Stack* st, ELEM_TYPE val) {
	assert(st != NULL);
	if (Is_Full(st)) {
		Inc(st);
	}
	st->base[st->top] = val;
	st->top++;
	return true;
}

4c1ffa6898fe4f4094a216984692334e.png      b068309499b94d50b337f417b42535a8.png

 

出栈(队尾删除) 
 



//出栈(队尾删除)  出栈,将值删除一个
bool Pop(struct Stack* st) {
	assert(st != NULL);
	if (Is_Empty(st)) {
		return false;
	}
	st->top--;
	return true;
}

7ad4104af27b4570b5cda9f62fa31bbc.png

 

获取栈顶元素值
 


//获取栈顶元素值 //获取栈顶的元素值,但是不删除
ELEM_TYPE Top(struct Stack* st) {
	assert(st != NULL);
	return st->base[st->top - 1];
}

判空


//判空
bool Is_Empty(struct Stack* st) {
	assert(st != NULL);
	return st->top == 0;
}


判满
 



//判满
bool Is_Full(struct Stack* st) {
	assert(st != NULL);
	return st->top == st->stacksize;
}


扩容



//扩容 *2
void Inc(struct Stack* st) {
	assert(st != NULL);
	ELEM_TYPE* tmp = (ELEM_TYPE*)realloc(st->base, (st->stacksize * sizeof(ELEM_TYPE)) * 2);
	if (tmp == NULL)
	{
		printf("error\n");
		return;
	}
	st->base = tmp;

	//st->top;//扩容成功。有效长度不变
	st->stacksize *= 2;
}




搜索
 



//搜索
int Search(struct Stack* st, ELEM_TYPE val) {
	assert(st != NULL);
	for (int i = 0; i < st->top; i++) {
		if (st->base[i] == val) {
			return i;
		}
	}
	return -1;
}


清空
 

//清空
void Clear(struct Stack* st) {
	 st->top = 0;
}

销毁
 


//销毁
void Destroy(struct Stack* st) {
	free(st->base);
	st->top = st->stacksize = 0;
}


打印
 


//打印
void Show(struct Stack* st) {
	assert(st != NULL);
	for (int i = 0; i < st->top; i++) {
		printf("%d", st->base[i]);
	}
}

获取有效值个数
 


//获取有效值个数
int Get_length(struct Stack* st) {
	assert(st != NULL);
	int count = 0;
	for (int i = 0; i < st->top; i++) {
		count++;
	}
	return count;
	//return st->top;
}

 

顺序栈的代码和Day03的顺序表差不多,大家只要注意入栈和出栈即可。如果大家有什么不懂的地方可以参考顺序表。最后记得一键三连哟。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值