栈结构之顺序栈详解(C语言版)


前言

      前面完成了线性表中循环双链表的学习,下面开始对栈结构中的顺序栈进行学习。

在这里插入图片描述

一、顺序栈的定义

      栈是限定仅在表尾进行插人或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶,相应地,表头端称为栈底。不含元素的空表称为空栈。栈的修改是按后进先出的原则进行的,因此栈又称为后进先出的线性表,简称LIFO结构。而顺序栈就是使用顺序结构来实现栈,顺序栈的空间是连续分配的。

在这里插入图片描述

二、顺序栈的结构

结构图

在这里插入图片描述
代码描述

#define ElemType int //栈内元素数据类型

#define STACK_INIT_SIZE  8    //栈初始化大小
#define STACK_INC_SIZE   3    //栈增量的大小

//顺序栈结构
typedef struct SeqStack
{
	ElemType *base;      //栈的基址 指向栈的空间
	int       capacity;  //栈的最大容量
	int       top;       //指向栈顶位置(可表示栈内元素个数)  
}SeqStack;

三、顺序栈的常用操作

初始化顺序栈

//初始化栈
void InitStack(SeqStack *s)
{
	//申请数据空间
	s->base = (ElemType *)malloc(sizeof(ElemType)*STACK_INIT_SIZE);
	assert(s->base != NULL);
	//设置容量的初始化大小
	s->capacity = STACK_INIT_SIZE;
	//设置栈顶的初始化指向
	s->top = 0;
}

扩展顺序栈容量

//增加栈的容量空间
bool Inc(SeqStack *s)
{
	//在原来栈空间基础上扩展STACK_INC_SIZE大小的空间
	ElemType *newbase = (ElemType *)realloc(s->base,sizeof(ElemType)*(s->capacity+STACK_INC_SIZE));
	//如果扩展失败,提示失败并退出
	if(newbase == NULL)
	{
		printf("内存不足,无法申请空间.\n");
		return false;
	}
	//将栈的基址指向扩展后的空间
	s->base = newbase;
	//将栈现容量设置为原栈容量+扩展的容量
	s->capacity += STACK_INC_SIZE;
	return true;
}

判断顺序栈是否已满

//判断栈是否已满
bool IsFull(SeqStack *s)
{
	//如果栈顶top的值大于等于容量的大小,则表示栈满
	return s->top >= s->capacity;
}

判断顺序栈是否为空

//判断栈是否为空
bool IsEmpty(SeqStack *s)
{
	//如果栈顶top的值等于0,则表示栈为空
	return s->top == 0;
}

入栈

//入栈
void Push(SeqStack *s, ElemType x)
{
	//判断栈是否满了,如果不是真正意义上的满(还可以继续申请空间)则申请空间
	if(IsFull(s) && !Inc(s))
	{
		printf("栈空间已满,%d 不能入栈.\n",x);
		return;
	}
	//栈未满,数据入栈(数据先入栈,然后top再加1)
	s->base[s->top++] = x;
	//s->top++;
}

出栈

//出栈
void Pop(SeqStack *s)
{
	//判断栈是否为空,如果为空不能出栈
	if(IsEmpty(s))
	{
		printf("栈空间已空,不能出栈.\n");
		return;
	}
	//将top值减一,模拟数据出栈
	s->top--;
}

获取栈顶元素

//获取栈顶元素
bool GetTop(SeqStack *s, ElemType *v)
{
	//如果栈为空,则获取不了栈顶元素
	if(IsEmpty(s))
	{	
		printf("栈空间已空,不能取栈顶元素.\n");
		return false;
	}
	//获取栈顶元素,top-1为栈顶元素所在栈的位置
	*v = s->base[s->top-1];
	return true;
}

打印栈内所有数据

//打印栈内所有的数据
void Show(SeqStack *s)
{
	//由于栈内数据是后进先出的,所以打印数据时由顶向底打印
	for(int i=s->top-1; i>=0; --i)
	{
		printf("%d\n",s->base[i]);
	}
	printf("\n");
}

获取栈内元素个数

//获取栈内元素的个数
int Length(SeqStack *s)
{
	//top值可以表示栈内的元素个数
	return s->top;
}

清空栈

//清空栈
void Clear(SeqStack *s)
{
	//将top的值设置为0,表示栈内已经没有元素
	s->top = 0;
}

销毁栈

//销毁栈
void Destroy(SeqStack *s)
{
	//释放栈内空间
	free(s->base);
	//将栈基址指为空
	s->base = NULL;
	//将栈容量和栈顶值设置为0
	s->capacity = s->top = 0;
}

结语

      对顺序栈的介绍就到这里,希望这篇文章能够给予你一些帮助。

在这里插入图片描述

附录

以下提供顺序栈的测试代码

SeqStack.h

#ifndef __SEQSTACK_H__
#define __SEQSTACK_H__

#include<stdio.h>
#include<malloc.h>
#include<assert.h>

#define ElemType int //栈内元素数据类型

#define STACK_INIT_SIZE  8    //栈初始化大小
#define STACK_INC_SIZE   3    //栈增量的大小

//顺序栈结构
typedef struct SeqStack
{
	ElemType *base;      //栈的基址 指向栈的空间
	int       capacity;  //栈的最大容量
	int       top;       //指向栈顶位置(可表示栈内元素个数)  
}SeqStack;

bool Inc(SeqStack *s);

void InitStack(SeqStack *s);
bool IsFull(SeqStack *s);
bool IsEmpty(SeqStack *s);

void Push(SeqStack *s, ElemType x);
void Pop(SeqStack *s);
bool GetTop(SeqStack *s, ElemType *v);
void Show(SeqStack *s);
int Length(SeqStack *s);
void Clear(SeqStack *s);
void Destroy(SeqStack *s);

#endif //__SEQSTACK_H__

SeqStack.cpp

#include"SeqStack.h"

//初始化栈
void InitStack(SeqStack *s)
{
	//申请数据空间
	s->base = (ElemType *)malloc(sizeof(ElemType)*STACK_INIT_SIZE);
	assert(s->base != NULL);
	//设置容量的初始化大小
	s->capacity = STACK_INIT_SIZE;
	//设置栈顶的初始化指向
	s->top = 0;
}
//增加栈的容量空间
bool Inc(SeqStack *s)
{
	//在原来栈空间基础上扩展STACK_INC_SIZE大小的空间
	ElemType *newbase = (ElemType *)realloc(s->base,sizeof(ElemType)*(s->capacity+STACK_INC_SIZE));
	//如果扩展失败,提示失败并退出
	if(newbase == NULL)
	{
		printf("内存不足,无法申请空间.\n");
		return false;
	}
	//将栈的基址指向扩展后的空间
	s->base = newbase;
	//将栈现容量设置为原栈容量+扩展的容量
	s->capacity += STACK_INC_SIZE;
	return true;
}

//判断栈是否已满
bool IsFull(SeqStack *s)
{
	//如果栈顶top的值大于等于容量的大小,则表示栈满
	return s->top >= s->capacity;
}

//判断栈是否为空
bool IsEmpty(SeqStack *s)
{
	//如果栈顶top的值等于0,则表示栈为空
	return s->top == 0;
}

//入栈
void Push(SeqStack *s, ElemType x)
{
	//判断栈是否满了,如果不是真正意义上的满(还可以继续申请空间)则申请空间
	if(IsFull(s) && !Inc(s))
	{
		printf("栈空间已满,%d 不能入栈.\n",x);
		return;
	}
	//栈未满,数据入栈(数据先入栈,然后top再加1)
	s->base[s->top++] = x;
	//s->top++;
}
//出栈
void Pop(SeqStack *s)
{
	//判断栈是否为空,如果为空不能出栈
	if(IsEmpty(s))
	{
		printf("栈空间已空,不能出栈.\n");
		return;
	}
	//将top值减一,模拟数据出栈
	s->top--;
}
//获取栈顶元素
bool GetTop(SeqStack *s, ElemType *v)
{
	//如果栈为空,则获取不了栈顶元素
	if(IsEmpty(s))
	{	
		printf("栈空间已空,不能取栈顶元素.\n");
		return false;
	}
	//获取栈顶元素,top-1为栈顶元素所在栈的位置
	*v = s->base[s->top-1];
	return true;
}

//打印栈内所有的数据
void Show(SeqStack *s)
{
	//由于栈内数据是后进先出的,所以打印数据时由顶向底打印
	for(int i=s->top-1; i>=0; --i)
	{
		printf("%d\n",s->base[i]);
	}
	printf("\n");
}
//获取栈内元素的个数
int Length(SeqStack *s)
{
	//top值可以表示栈内的元素个数
	return s->top;
}
//清空栈
void Clear(SeqStack *s)
{
	//将top的值设置为0,表示栈内已经没有元素
	s->top = 0;
}
//销毁栈
void Destroy(SeqStack *s)
{
	//释放栈内空间
	free(s->base);
	//将栈基址指为空
	s->base = NULL;
	//将栈容量和栈顶值设置为0
	s->capacity = s->top = 0;
}

Main.cpp

#include"SeqStack.h"

void main()
{
	SeqStack st;
	InitStack(&st);

	ElemType v;
	for(int i=1; i<=10; ++i)
	{
		Push(&st,i);
	}
	Show(&st);
	Clear(&st);
	Show(&st);

	Destroy(&st);
}
  • 17
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值