一、栈的基本概念
栈是一种遵循后进先出(Last In First Out,LIFO)原则的数据结构,想象它就像一个只能在一端进行操作的容器,这一端被称为栈顶(Top)。就好比往一个竖着的桶里放东西,最后放进去的东西要最先被取出来。例如,我们将元素依次压入栈中,那么取元素的时候,最先取出的一定是最后压入栈的那个元素。
二、基于数组实现栈
在c语言中实现栈的方式主要有两种,一种是数组,一种是链表;两种方法各有优缺点,下面是使用数组的方式来实现。
1.定义栈的结构
cpp
typedef int STDataType;
typedef struct StackNode
{
STDataType* arr;
int capacity;//栈的空间大小
int top;//栈顶
}ST;
2.栈的初始化
cpp
void STInit(ST* ps)
{
assert(ps);
ps->arr = NULL;
ps->capacity = ps->top = 0;
}
3.入栈
cpp
void StackPush(ST* ps, STDataType x)
{
assert(ps);
if (ps->capacity == ps->top)//判断空间是否足够
{
int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
STDataType* tmp = (STDataType*)realloc(ps->arr, newcapacity * sizeof(STDataType));
if (tmp == NULL)
{
perror("relloc fail!!!");
exit(1);
}
ps->arr = tmp;
ps->capacity = newcapacity;
}
4.判断元素个数是否为空
cpp
bool StackEmpty(ST* ps)
{
assert(ps);
return ps->top == 0;
}
5.出栈
cpp
void StackPop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
--ps->top;
}
6.取栈顶元素
cpp
STDataType StackTop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
return ps->arr[ps->top-1];
}
7.获取栈的有效元素个数
cpp
int STSize(ST* ps)
{
assert(ps);
return ps->top;
}
8.销毁栈
cpp
void STDestroy(ST* ps)
{
assert(ps);
if (ps->arr)
{
free(ps->arr);
}
ps->arr = NULL;
ps->capacity = ps->top = 0;
}
三.栈的完整代码
Stack.h
cpp
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
//定义栈的结构
typedef int STDataType;
typedef struct StackNode
{
STDataType* arr;
int capacity;//栈的空间大小
int top;//栈顶
}ST;
//栈的初始化
void STInit(ST* ps);
//入栈
void StackPush(ST* ps, STDataType x);
//出栈
void StackPop(ST* ps);
//取栈顶元素
STDataType StackTop(ST* ps);
//获取栈的有效元素个数
int STSize(ST* ps);
//销毁栈
void STDestroy(ST* ps);
stack.c
cpp
#include "stack.h"
//栈的初始化
void STInit(ST* ps)
{
assert(ps);
ps->arr = NULL;
ps->capacity = ps->top = 0;
}
//入栈
void StackPush(ST* ps, STDataType x)
{
assert(ps);
if (ps->capacity == ps->top)//判断空间是否足够
{
int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
STDataType* tmp = (STDataType*)realloc(ps->arr, newcapacity * sizeof(STDataType));
if (tmp == NULL)
{
perror("relloc fail!!!");
exit(1);
}
ps->arr = tmp;
ps->capacity = newcapacity;
}
//空间足够
ps->arr[ps->top++] = x;
}
//判断元素个数是否为空
bool StackEmpty(ST* ps)
{
assert(ps);
return ps->top == 0;
}
//出栈
void StackPop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
--ps->top;
}
//取栈顶元素
STDataType StackTop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
return ps->arr[ps->top-1];
}
//获取栈的有效元素个数
int STSize(ST* ps)
{
assert(ps);
return ps->top;
}
//销毁栈
void STDestroy(ST* ps)
{
assert(ps);
if (ps->arr)
{
free(ps->arr);
}
ps->arr = NULL;
ps->capacity = ps->top = 0;
}
text.c
cpp
#include "stack.h"
void text()
{
ST st;
STInit(& st);
StackPush(&st, 1);
StackPush(&st, 2);
StackPush(&st, 3);
StackPush(&st, 4);
printf("%d\n", StackTop(&st));
StackPop(&st);
printf("%d\n", STSize(&st));
STDestroy(&st);
}
int main()
{
text();
return 0;
}