前面完成了线性表中循环双链表的学习,下面开始对栈结构中的顺序栈进行学习。
栈是限定仅在表尾进行插人或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶,相应地,表头端称为栈底。不含元素的空表称为空栈。栈的修改是按后进先出的原则进行的,因此栈又称为后进先出的线性表,简称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
#include
#include
#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);
}