1.栈的概念及结构
栈是一种特殊的线性表,它只允许从固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵循后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈,出数据也在栈顶。
2.栈的实现
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优游戏额。因为数组在尾插尾删数据时的代价比较小。
实现数组栈的代码如下:
分为三个文件实现,头文件,函数实现文件和测试文件
头文件:
#pragma once
#include<stdio.h>
#include<stdbool.h>
#include<assert.h>
#include<stdlib.h>
//声明栈结构体
typedef struct Stack
{
int* data;
int top;
int capacity;
}Stack;
//初始化栈声明
void StackInit(Stack* ptr);
//入栈声明
void StackPush(Stack* ptr, int x);
//出栈声明
void StackPop(Stack* ptr);
//获取栈顶元素声明
int StackTop(Stack* ptr);
//获取栈中有效元素个数声明
int StackSize(Stack* ptr);
//检测栈是否为空,为空返回0,不为空返回有效元素个数
int StackEmpty(Stack* ptr);
//销毁栈
void StackDestory(Stack* ptr);
函数实现文件:
#include"Stack.h"
//初始化栈函数实现
void StackInit(Stack* ptr)
{
assert(ptr);
ptr->data = NULL;
ptr->top = 0;
ptr->capacity = 0;
}
//入栈函数实现
void StackPush(Stack* ptr, int x)
{
assert(ptr);
if (ptr->top == ptr->capacity)
{
int newcapacity = ptr->capacity == 0 ? 4 : ptr->capacity * 2;
int* tmp = (int*)realloc(ptr->data, sizeof(int) * newcapacity);
if (tmp == NULL)
{
perror("realloc fail");
return;
}
ptr->data = tmp;
ptr->capacity = newcapacity;
}
ptr->data[ptr->top] = x;
ptr->top++;
}
//出栈函数实现
void StackPop(Stack* ptr)
{
assert(ptr);
assert(StackEmpty(ptr));
ptr->top--;
}
//获取栈顶元素函数实现
int StackTop(Stack* ptr)
{
assert(ptr);
assert(StackEmpty(ptr));
return ptr->top;
}
//获取栈中有效元素个数函数实现
int StackSize(Stack* ptr)
{
assert(ptr);
return ptr->top;
}
//检测栈是否为空,为空返回0,不为空返回有效元素个数函数实现
int StackEmpty(Stack* ptr)
{
assert(ptr);
return ptr->top;
}
//销毁栈
void StackDestory(Stack* ptr)
{
assert(ptr);
free(ptr->data);
ptr->data = NULL;
ptr->capacity = ptr->top = 0;
printf("销毁成功!\n");
}
测试文件:
#include"Stack.h"
void test()
{
Stack st;
StackInit(&st);
StackPush(&st, 1);
StackPush(&st, 2);
StackPush(&st, 3);
StackPush(&st, 4);
while (StackSize(&st))
{
printf("%d ", StackTop(&st));
StackPop(&st);
}
StackDestory(&st);
}
int main()
{
test();
return 0;
}