栈:什么是栈?又该怎么理解呢?
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出)
- 栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。
下面实现栈的基本操作
- 初始化
- 入栈
- 出栈
- 取栈顶元素
- 销毁栈
SeqStack.h文件内容
#pragma once
#include <stddef.h>
#include <stdio.h>
typedef char SeqStackType;
typedef struct SeqStack
{
SeqStackType *data;
size_t size; //有效元素个数
size_t capicity; //等效与Maxsize
}SeqStack;
void SeqStackInit(SeqStack* stack); //初始化栈
void SeqStackPrint(SeqStack* stack,const char *s); //打印栈
void SeqStackPush(SeqStack* stack,SeqStackType value); //入栈
void SeqStackPop(SeqStack* stack); //出栈
int SeqStackTop(SeqStack* stack,SeqStackType* value); //取栈顶元素
void SeqStackDestory(SeqStack* stack); //销毁栈
初始化时,有效元素size为0;同时设置顺序表容量,并且给指针分配内存空间
//初始化栈
void SeqStackInit(SeqStack* stack)
{
if(stack==NULL)
{
printf("非法输入\n");
return ;
}
stack->size=0;
stack->capicity=1024; //设置容量
stack->data=(SeqStackType*)malloc(stack- >capicity*sizeof(SeqStack)); //申请空间
}
扩容时,扩容策略由自己定。capicity一般将他直接扩大二倍,是由于STL的扩容原则这样规定,+1是为了排除原来大小是0的情况
//扩容
void SeqStackResize(SeqStack* stack)
{
if(stack==NULL)
{
printf( " 非法输入\n");
return ;
}
SeqStackType* new=NULL;
//如果size>capicity,则扩容
if(stack->size>=stack->capicity)
{
//扩大capicity
stack->capicity=stack->capicity*2+1;
//申请内存
new=(SeqStackType *)malloc(stack->capicity*sizeof( SeqStack));
}
size_t i=0;
//搬移数据
for( ;i<stack->size;i++)
{
new[i]=stack->data[i];
}
//释放原来的指针
free(stack->data);
stack->data=new;
}
从栈顶进入。入栈时需要考虑size大于顺序表的特殊情况,当超出时,需要扩容。
//入栈
void SeqStackPush(SeqStack* stack,SeqStackType value)
{
if(stack==NULL)
{
printf( " 非法输入\n");
return ;
}
if(stack->size>=stack->capicity)
{
SeqStackResize(stack);
}
stack->data[stack->size++]=value;
}
出栈时要考虑空栈情况,若空栈,没有元素出栈。出栈失败。出栈操作只需要将有效元素减1即可。
//出栈
void SeqStackPop(SeqStack* stack)
{
if(stack==NULL)
{
printf( " 非法输入\n");
return ;
}
if( stack->size==0)
{
printf("空栈\n");
return ;
}
--stack->size;
}
取栈顶元素时记住不是删除栈顶元素,而是将其取出来,所以
*value=stack->data[stack->size-1];这里是size-1.而不是size–,取栈顶元素,而不是删除栈顶元素
//取栈顶元素
int SeqStackTop(SeqStack* stack,SeqStackType* value)
{
//取值失败返回0,成功返回1
if(stack==NULL||value==NULL)
{
printf( " 非法输入\n");
return 0;
}
if( stack->size==0)
{
printf("空栈\n");
return 0;
}
*value=stack->data[stack->size-1];//这里是size-1.而不是size--
return 1;
}
销毁队列时,除了将有效元素置为零,还需要将容量capicity设置为零,释放data指针。
//销毁队列
void SeqStackDestory(SeqStack* stack)
{
if(stack==NULL)
{
printf("非法操作\n");
return;
}
stack->size=0;
stack->capicity=0;
free(stack->data);
}