栈的介绍
栈(Stack)是只允许在一端进行插入或删除操作的线性表,栈的操作特性是后进先出(Last In First Out),称为后进先出的线性表。
实现栈使用的是数组
typedef int Datatype;
typedef struct Stack {
Datatype* data;
int top;//栈顶元素
int capacity;//容量上限
}ST;
在这里 typedef int Datatype 的原因是方便之后可能要修改存储数据的类型。
在这里top 实际为数组的下标。
栈的实现
实现栈分为以下几个操作:
- 栈的初始化
- 栈的销毁
- 入栈
- 出栈
- 输出栈顶元素
- 输出元素个数
- 判读栈是否为空
void STInit(ST* ps);//栈的初始化
void STDestory(ST* ps);//栈的销毁
void STPush(ST* ps, Datatype x);
void STPop(ST* ps);
Datatype STTop(ST* ps);//栈顶元素
int STSize(ST* ps);//当前元素的个数
bool STEmpty(ST* ps);//判读栈是否为空
首先下面的大多都要确保传入的指针不为空。
栈的初始化
void STInit(ST* ps) {
assert(ps);
ps->data = NULL;
ps->top = 0;
ps->capacity = 0;
}
栈的销毁
void STDestory(ST* ps) {
assert(ps);
free(ps->data);
ps->data = NULL;
ps->top = ps->capacity = 0;
}
判读栈是否为空
当下表top为0时,栈即为空。
bool STEmpty(ST* ps) {
//if (ps->top == 0)
//{
// return true;
//}
//else {
// return false;
//}
return ps->top == 0;
}
上方注释的内容可以精简为下方的代码
入栈
首先如果top,capacity的值相同,代表数组已经达到当前的容量上限,需要再扩容。
如果不需要扩容,就直接将数组的这一个下标的数据改为入栈的值。
void STPush(ST* ps, Datatype x) {
assert(ps);
if (ps->top == ps->capacity)//扩容
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//
Datatype* tmp = (Datatype*)realloc(ps->data, newcapacity * sizeof(Datatype));//!!!
if (tmp == NULL) {
perror("realloc fail");
return;
}
ps->data = tmp;
ps->capacity = newcapacity;//!!!
}
ps->data[ps->top] = x;
ps->top++;
}
删除栈顶元素
当传入的指针不为空并且栈不为空时,可以删除栈顶元素。
删除栈顶元素直接将数组下标减一即可。
void STPop(ST* ps) {
assert(ps);
assert(!STEmpty(ps));
ps->top--;
}
输出栈顶元素
当传入的指针不为空并且栈不为空时,可以输出栈顶元素。
Datatype STTop(ST* ps) {
assert(ps);
assert(!STEmpty(ps));
return ps->data[(ps->top) - 1];
}
输出元素个数
int STSize(ST* ps) {
return ps->top;
}
总体
#include"stack.h"
namespace STACK
{
void STInit(ST* ps) {
assert(ps);
ps->data = NULL;
ps->top = 0;
ps->capacity = 0;
}
void STDestory(ST* ps) {
assert(ps);
free(ps->data);
ps->data = NULL;
ps->top = ps->capacity = 0;
}
void STPush(ST* ps, Datatype x) {
assert(ps);
if (ps->top == ps->capacity)//扩容
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//
Datatype* tmp = (Datatype*)realloc(ps->data, newcapacity * sizeof(Datatype));//!!!
if (tmp == NULL) {
perror("realloc fail");
return;
}
ps->data = tmp;
ps->capacity = newcapacity;//!!!
}
ps->data[ps->top] = x;
ps->top++;
}
void STPop(ST* ps) {
assert(ps);
assert(!STEmpty(ps));
ps->top--;
}
Datatype STTop(ST* ps) {
assert(ps);
assert(!STEmpty(ps));
return ps->data[(ps->top) - 1];
}
int STSize(ST* ps) {
return ps->top;
}
bool STEmpty(ST* ps) {
//if (ps->top == 0)
//{
// return true;
//}
//else {
// return false;
//}
return ps->top == 0;
}
}
(如有问题,烦请指出)