栈的概念:是一种特殊的线性表,只允许在固定的一端进行插入和删除操作。(尾插和尾删)进行插入和删除的一端称为栈顶,另一端称为栈底。
栈的结构:栈是先进后出。
栈的实现:栈可以使用链表和数组实现,相对而言数组的结构更有利于栈的实现。
以下是我对栈的实现:
头文件
#pragma once
#include<stdio.h>
#include<assert.h>
#include<malloc.h>
#include<Windows.h>
#pragma warning(disable:4996)
typedef int DataType;
typedef struct Stack{
DataType *array;//申请一个栈空间
int Capacity;//栈空间大小
int size;//栈中有效元素的大小
}Stack;
void StackInit(Stack *ps);//初始化
void StackPush(Stack *ps, DataType val);//入栈
void StackPop(Stack *ps);//出栈
DataType StackTop(Stack *ps);//获取栈顶元素
int StackSize(Stack *ps);//获取有效元素的个数
int StackEmpty(Stack *ps);//判空
void StackDestroy(Stack *ps);//销毁
void TestStack();
各函数的实现:
#include"Stack.h"
void StackInit(Stack *ps)//初始化
{
assert(ps);
ps->array = (DataType*)malloc(sizeof(DataType)*10);
ps->size = 0;
ps->Capacity = 10;
}
void CheckCapacity(Stack *ps)
{
if (ps->size == ps->Capacity){
int newcapacity = ps->Capacity * 2;
DataType *temp = (DataType*)malloc(sizeof(DataType)*newcapacity);
if (temp){
for (int i = 0; i < ps->size; i++){
temp[i] = ps->array[i];
}
free(ps->array);
ps->array = temp;
ps->Capacity = newcapacity;
}
}
}
void StackPush(Stack *ps, DataType val)//入栈
{
assert(ps);
CheckCapacity(ps);
ps->array[ps->size] = val;
ps->size++;
}
void StackPop(Stack *ps)//出栈
{
assert(ps);
if (StackEmpty(ps)){
return;
}
ps->size--;
}
DataType StackTop(Stack *ps)//获取栈顶元素
{
assert(ps);
return ps->array[ps->size - 1];
}
int StackSize(Stack *ps)//获取有效元素的个数
{
assert(ps);
return ps->size;
}
int StackEmpty(Stack *ps)//判空
{
assert(ps);
return ps->size == 0;
}
void StackDestroy(Stack *ps)//销毁
{
assert(ps);
free(ps->array);
ps->Capacity = 0;
ps->size = 0;
}
void TestStack()
{
Stack s;
StackInit(&s);
StackPush(&s, 1);
StackPush(&s, 2);
StackPush(&s, 3);
StackPush(&s, 4);
StackPush(&s, 5);
StackPush(&s, 6);
printf("stack size: %d\n", StackSize(&s));
printf("stack top: %d\n", StackTop(&s));
StackPop(&s);
StackPop(&s);
StackPop(&s);
printf("stack size: %d\n", StackSize(&s));
printf("stack top: %d\n", StackTop(&s));
StackDestroy(&s);
}
主函数:
#include"Stack.h"
int main()
{
TestStack();
system("pause");
return 0;
}
运行结果截图: