①头文件:
#pragma once //防止头文件被重复包含
#include<stdio.h>
#include<stdbool.h>
#include<assert.h>
#include<stdlib.h>
//如果采用链表来实现栈,
//1)若采用尾插和尾删来操作栈,则需要使用双向链表来实现。
//2)若采用头插和头删来操作栈,可以使用单链表来实现
typedef int STDatatype;
typedef struct Stack{
STDatatype* a; //栈起始位置
int top; //栈顶位置
int capacity; //栈的容量
}ST;
void StackInit(ST* ps);
void StackDestroy(ST* ps);
void StackPush(ST* ps, STDatatype x);
void StackPop(ST* ps);
STDatatype StackTop(ST* ps);
int StackSize(ST* ps);
bool StackEmpty(ST* ps);
②函数实现文件:stack.c
#include"stack.h"
void StackInit(ST* ps){
ps->a = (STDatatype*)malloc(sizeof(STDatatype)* 4);
ps->capacity = 4;
ps->top = 0;
/*
1)如果top 选择初始为 0,则在每次入栈或者出栈之后,
top指向的都是栈顶元素的下一个位置。
2)如果top 选择初始为 1,则在每次入栈或者出栈之后,
top指向的都是栈顶元素的当前位置。
*/
}
void StackDestroy(ST* ps){
assert(ps);
free(ps->a);
ps->a = NULL;
ps->capacity = ps->top = 0;
}
void StackPush(ST* ps, STDatatype x){
assert(ps);
//入栈之前要判断原栈是否已经满了
if (ps->top == ps->capacity){
STDatatype* tmp = (STDatatype*)realloc(ps->a, ps->capacity * 2 * sizeof(STDatatype));
//判断是否有足够的空间来扩容
if (tmp == NULL){
printf("realloc fail!");
exit(-1);
}
else{
ps->a = tmp;
ps->capacity *= 2;
}
}
ps->a[ps->top] = x;
ps->top++;
}
void StackPop(ST* ps){
assert(ps);
//倘若原来栈中没有元素,则top = 0,这时候调用StackPop直接报错。
assert(ps->top > 0);
//通过直接调用top--,直接可以达到栈顶元素出栈的效果
ps->top--;
}
STDatatype StackTop(ST* ps){
assert(ps);
//倘若原来栈中没有元素,则top = 0,这时候调用StackTop直接报错。
assert(ps->top > 0);
return ps->a[(ps->top) - 1];
}
int StackSize(ST* ps){
assert(ps);
return ps->top;
}
bool StackEmpty(ST* ps){
assert(ps);
//采用return后面直接接表达式的方式
//1)如果top为0,则直接返回true
//2)如果top不等于,则直接返回false
return ps->top == 0;
}
③测试文件:
#include"stack.h"
#include"Quene.h"
void TestStack(){
ST st;
StackInit(&st);
StackPush(&st, 1);
StackPush(&st, 2);
StackPush(&st, 3);
StackPush(&st, 4);
StackPush(&st, 5);
StackPop(&st);
StackPop(&st);
StackPush(&st, 6);
while (!StackEmpty(&st)){
printf("%d ", StackTop(&st));
StackPop(&st);
}
printf("\n");
StackDestroy(&st);
}
void TestQuene(){
Quene q;
QueneInit(&q);
QuenePush(&q, 1);
QuenePush(&q, 2);
QuenePush(&q, 9);
QuenePush(&q, 8);
QuenePush(&q, 5);
QuenePush(&q, 6);
QuenePop(&q);
QuenePop(&q);
printf("\n");
printf("%d", QueneSize(&q));
}
int main(){
TestQuene();
return 0;
}