栈的实现
要实现栈首先我们需要了解什么是栈,即就是栈的定义。
栈和队列是很想像的,但是他们有一个根本的区别,栈是后进先出,而队列是先进先出,因此要好好区分这一点。
实现栈需要实现栈的以下几个动作:
- 创建栈
- 入栈
- 出栈
- 取栈顶元素
- 销毁栈
因此它相对于实现顺序表和链表来说是比较简单的,因为实现顺序表、链表往往动作是非常多的。栈的入栈和出栈实现时就是使用头插和头删或者是尾插和尾删,这两个组合是相对应的。但是当用链表来实现入栈的时候,为了使其更好看些,一般使用的是头插和头删。
下面我们分别用顺序表和链表来实现下栈:
顺序表实现:
//SqStack.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
typedef char SqStackType;
typedef struct SqStack{
SqStackType* data;
size_t size;
size_t capacity; //MAXSIZE的替代品,data这段内存中能容纳的元素个数
}SqStack;
void InitSqStack(SqStack *sq);//初始化栈
void SqStackPush(SqStack *sq, SqStackType value);//进栈
void SqStackPop(SqStack *sq);//出栈
//返回两个信息:执行成功失败;栈顶元素的值是多少
int SqStackTop(SqStack *sq, SqStackType* value);//取栈顶元素
void SqStackDestroy(SqStack *sq);//销毁栈
//SqStack.c
#include "SqStack.h"
//初始化
void InitSqStack(SqStack *sq){
if(sq == NULL){
return;//非法输入
}
sq -> size = 0;
sq -> capacity = 1000;
sq -> data = (SqStackType*)malloc(sq -> capacity *sizeof(SqStackType));
}
//栈的扩容策略
void SqStackReSize(SqStack *sq){
if(sq == NULL){
return;
}
if(sq -> size < sq -> capacity){
return;
}
sq -> capacity = sq -> capacity * 2 + 1;//capacity*2(是C++里面的一个方法) + 1(为了方式capacity为0)
SqStackType* new_ptr = (SqStackType*) malloc(sq -> capacity *sizeof(SqStackType));
size_t i = 0;
for(; i < sq -> size; ++i){
new_ptr[i] = sq -> data[i];
}
free(sq -> data);
sq -> data = new_ptr;
}
//入栈
void SqStackPush(SqStack *sq, SqStackType value){
if(sq == NULL){
return;//非法输入
}
if(sq -> size >= sq -> capacity){
//栈满进行扩容