栈的定义
栈是一种存储数据的结构,这种结构的特点是LIFO(Last In First Out),即后进先出原则。
我们可以将栈看作一个杯子,将数据看作与杯子直径相同的小球,当我们连续放入多个小球后想要取出某一个时,只能先将后放入的小球依次取出,直到取出目标小球为止。
栈的实现
栈的数据的插入和删除只有尾插和尾删,我们的首选是顺序表。
顺序表实现:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int StackDateType;
typedef struct Stack {
StackDateType* data;
int top;//栈顶元素的位置
int capacity;//栈的容量
}Stack;
void StackInit(Stack* p){
assert(p);
p->data = (StackDataType*)malloc(sizeof(StackDataType));
if(NULL == p){
perror("malloc fail");
return;
}
p->capacity = 4;
p->top = 0;
}
void StackDestory(Stack* p){
assert(p);
free(p->data);
p->data = NULL;
}
void StackPush(Stack* p, StackDataType x){
assert(p);
//判断栈是否已满,判断是否扩容
if(p->top == p->capacity){
p->data = (StackDataType*)realloc(p->data,sizeof(StackDataType)*p->capacity*2))
if(p->data == NULL)
perror("realloc fail");
return;
}
p->capacity *= 2;
}
p->data[p->top] = x;
p->top++;
}
bool StackEmpty(Stack* p){
assert(p);
return p->top == 0;
}
void StackPop(Stack* p){
assert(p);
//数据删除,栈不能为空
assert(!StackEmpty(p));
p->top--;
}
StackDataType StackTop(Stack* p){
assert(p);
assert(!StackEmpty(p));
//top是尾元素的下一个元素的下标
return p->data[p->top - 1];
}