先上干货:
栈(Stack)是一种具有特定操作规则的数据结构,它按照后进先出(LIFO,Last In First Out)的原则进行操作。栈可以简单地理解为一个容器,元素只能从栈顶入栈和出栈,而不能在中间或底部进行操作。
栈的定义包含以下要素:
- 存储空间:栈通常使用数组或链表来实现存储空间。
- 栈顶指针:用来指示当前栈顶元素的位置。初始时,栈为空,栈顶指针指向一个特定的空位置。
- 入栈操作(Push):将元素压入栈顶,使得栈顶指针向上移动,并将元素放入新的栈顶位置。
- 出栈操作(Pop):将栈顶元素弹出,即移除栈顶元素,同时栈顶指针向下移动。
- 栈空判断:判断栈是否为空,即栈顶指针是否指向空位置。
- 栈满判断(对于顺序栈):当栈中元素个数已达到最大容量时,称栈为满栈。
栈常用于需要后进先出操作的场景,例如函数调用的递归、表达式求值、括号匹配等。
SeqStack.h部分:
#include <stdio.h>
#include <malloc.h>
#include<string.h>
#include <assert.h>
typedef int ElemType;//定义栈中元素类型
#define MaxSize 100 //定义顺序栈初始存储空间大小
typedef struct SeqStack //定义栈结构
{
ElemType *base; //顺序栈存储空间基地址
int top; //栈顶位置,同时也表示栈中元素个数
int Stack_size; //栈当前空间大小,以元素为单位
}SeqStack;
void initStack(SeqStack *s);//初始化栈
int isFull(SeqStack *s);//判断栈是否已满
int isEmpty(SeqStack *s);//判断栈是否为空
void push(SeqStack *s,ElemType x);//入栈
void pop(SeqStack *s);//出栈
char getTop(SeqStack *s,ElemType *v); //获得栈顶元素
int length(SeqStack *s);//返回栈中元素个数
void destroy(SeqStack *s);//销毁栈
该代码段给出了一个顺序栈(Sequential Stack)的实现,同时还包括了栈的各种操作函数。下面对每个函数进行详细解释:
-
initStack(SeqStack *s)
:初始化栈函数。用于对栈进行初始化,包括动态分配存储空间,并将栈顶指针和栈大小置零。 -
isFull(SeqStack *s)
:判断栈是否已满函数。用于检查栈是否已经满员,即判断栈中元素个数是否达到栈的最大容量。 -
isEmpty(SeqStack *s)
:判断栈是否为空函数。用于检查栈是否为空,即判断栈中元素个数是否为零。 -
push(SeqStack *s, ElemType x)
:入栈函数。将元素x
入栈,将栈顶指针上移,并将元素放入新的栈顶位置。 -
pop(SeqStack *s)
:出栈函数。将栈顶元素弹出,即移除栈顶元素,同时栈顶指针下移。 -
getTop(SeqStack *s, ElemType *v)
:获得栈顶元素函数。将栈顶元素的值存储在指针v
所指向的变量中,并返回一个标志位,表示操作是否成功。 -
length(SeqStack *s)
:返回栈中元素个数函数。用于返回栈中当前元素个数,即栈顶指针的值。 -
destroy(SeqStack *s)
:销毁栈函数。释放栈所占用的存储空间,并将相关变量重置为初始状态。
SeqStack.c部分:
#include "SeqStack.h"
void initStack(SeqStack *s)
{
s->base=(ElemType)malloc(sizeof(ElemType)*MaxSize);
s->top=-1;
s->Stack_size=MaxSize;
}
int isFull(SeqStack *s)
{ if(s->top==s->Stack_size){
printf("栈满!\n");
return NULL;
}
return 1;
}
int isEmpty(SeqStack *s)
{
if(s->top==-1){
printf("栈空!\n");
return 1;
}else {
printf("栈非空\n");}
return NULL;
}
void push(SeqStack *s,ElemType x)
{
s->top=s->top+1;
s->base[s->top]=x;
return;
}
void pop(SeqStack *s)
{
if(s->top>=0)
s->top--;
return ;
}
char getTop(SeqStack *s,ElemType *v)
{
v=s->base[s->top];
printf("获得栈顶元素%d\n",v);
return 0;
}
int length(SeqStack *s)
{
return s->top;
}
void destroy(SeqStack *s)
{
free(s->data); // 释放栈所占用的内存空间
s->top = -1; // 将栈顶指针重置为初始位置
s->size = 0; // 将栈的大小设置为0,表示栈为空
}
main.c部分:
#include "SeqStack.h"
int main()
{
SeqStack s;
initStack(&s);
int x;
int v=3;
while(v--)
{
scanf("%d",&x);
push(&s,x);
}
getTop(&s,v);
destroy(&s);
}