数据结构--栈(Stack)

Posted 小鹿可可乐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构--栈(Stack)相关的知识,希望对你有一定的参考价值。

1.栈的定义

  • 定义:

栈:一种先进后出,后进先出的数据结构
(如箱子存放东西)
栈和队列都是受到限制的顺序表

  • 栈分为顺序栈和链式栈
  • 栈只能在一端进行插入和删除,插入和删除的这一端称为栈顶,另一端称为栈底

2.顺序栈

  • 结构体的设计:

2.1代码设计解析

  • 获取栈顶元素的值,但不删除
//返回类型和存放的值类型一致,当我们断言失败时候,返回的值有可能就是我们要存放的值,会起冲突
bool Get_top(PStack ps);

//reval 是我们的输出参数
bool Get_top(PStack ps,int *rtval);

错误示范:

int get_top(pstack)
{
assert(ps!=null);
if(ps = null)
return ??;   //-1     \\0
             //\\0只有字符串认识他,别人不理   ‘#’也不行 '#'==35
if(isempty(ps))
{
 return ??;
}
}
  • 清空
ps->top = 0;//让0下标为可插入的位置,不关注里边的值
//栈顶指针直接指向0

2.2源代码

头文件(stack.h)

#pragma once  //防止头文件重复
//顺序栈的栈顶在尾部,因为入栈和出栈的时间复杂度为O(1)
#define INIT_SIZE 10

typedef int ELEMTYPE;

typedef struct PStack
{
	int *base;//用来malloc申请动态内存
	int stack_Size;//栈总体个数
	int top;//栈顶指针,当前栈存放的有效元素个数指向下一个存放数据的位置 
}PStack, *PStack;

//增删改查 
//初始化 
void InitStack(PStack ps); 

//入栈操作(尾插) 
bool Push(PStack ps, int val); 

//获取栈顶元素的值,但不删除 
bool Get_top(PStack ps, int *rtval);// rtval 是我们的输出参数

//获取栈顶元素的值,但删除,出栈操作(尾删) 
bool Pop(PStack ps, int *rtval); 

//判空 
bool IsEmpty(PStack ps);

//判满 
bool IsFull(PStack ps);

//获取有效元素个数 
int Get_length(PStack ps); 

//清空 
void Clear(PStack ps); 

//销毁
void Destroy(PStack ps);

//扩容
void Inc(PStack ps);

源文件(stack.cpp):

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

//初始化
void InitStack(PStack ps)
{
	assert(ps != NULL);
	if (ps == NULL) return;
	ps->base = (int *)malloc(sizeof(int)* INIT_SIZE);
	assert(ps->base != NULL);
	ps->top = 0;
	ps->stack_Size = INIT_SIZE;
}

//入栈操作(尾插)
bool Push(PStack ps, int val)
{
	//断言 
	assert(ps != NULL);
	if (ps == NULL) return false;
	//判满 
	if (IsFull(ps))
	{

		//如果满了,扩容
		Inc(ps);
	}
	//插入 
	//ps->base[ps->top++] = val;
	ps->base[ps->top] = val;//数组形式一致
	ps->top++;
	//返回值 
	return true;
}

//获取栈顶元素的值,但不删除 
//int get_top(pstack ps) 
bool Get_top(PStack ps, int *rtval)
{
	//断言
	assert(ps != NULL);
	if (ps == NULL) return false; //-1 \\0 
	//\\0只用字符串认识他,别人根本不理它 '#'也不行 ‘#’== 35
	if (IsEmpty(ps))
	{
		return false;
	}
	*rtval = ps->base[ps->top - 1];
	return true;
}

//获取栈顶元素的值,但删除,出栈操作(尾删)
//int Pop(PStack ps)
bool Pop(PStack ps, int *rtval)
{
	//断言 ps不能为NULL且栈不能是空栈
	assert(ps != NULL && !IsEmpty(ps));
	if (ps == NULL || IsEmpty(ps))
		return false;
	获取值 
	//*rtval = ps->base[ps->top-1];
	有效个数-1 
	//ps->top--; 
	返回值
	*rtval = ps->base[--ps->top];
	return true;
}
//判空
bool IsEmpty(PStack ps)
{
	return ps->top == 0;
}

//判满
bool IsFull(PStack ps)
{
	return ps->top == ps->stack_Size;
}

//获取栈顶元素的值,删除,出栈操作(尾删)

int Get_length(PStack ps)
{
	return ps->top;
}
//清空
void Clear(PStack ps)
{
	ps->top = 0;
}
//销毁
void Destroy(PStack ps)
{
	//断言
	assert(ps != NULL);
	if (ps == NULL)
		return;
	//释放malloc申请的动态内存 
	free(ps->base);
	//将指针赋值为NULL,防止出现野指针 
	ps->base = NULL;
	ps->top = 0;
	ps->stack_Size = 0;
}
//扩容
void Inc(PStack ps)
//如果按2倍去扩容 1.5
{
	//断言 
	assert(ps != NULL);
	if (ps == NULL)
		return;
	//给栈空间最大容量重新赋值
	ps->stack_Size *= 2;
	//从堆内申请更大的空间给我们
	ps->base = (int *)realloc(ps->base, sizeof(int)* ps->stack_Size);
}

测试函数:

int main()
{
	Stack head;
	InitStack(&head);

	for (int i = 0; i<15; i++)
	{
		Push(&head, i);
	}
	int rtval = 0;
	printf("%d\\n", Get_length(&head));

	while (!IsEmpty(&head))
	{
		Get_top(&head, &rtval);
		printf("%d ", rtval);
		Pop(&head, &rtval);
	}

	printf("\\n");
	printf("%d\\n", Get_length(&head));

	Clear(&head);
	printf("%d\\n", Get_length(&head));
jieg

	Destroy(&head);
	Destroy(&head);

	return 0;
}


结果展示:

以上是关于数据结构--栈(Stack)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构--栈(Stack)

stack栈

剑指 Offer 09. 用两个栈实现队列

栈--原地reverse栈

栈(Stack)

java 中 heap(堆)和stack(栈)的区别