什么是栈?
1.栈是一种逻辑结构,特殊的线性表,只能在一端操作
栈的逻辑特性是 : "先进后出" "后进先出"
2.栈结构
1.栈顶,可以进行放数据(入栈,压栈)和取数据(出栈,弹栈)的一端
2.栈底,栈顶的反端,是不可以取数据的
3.入栈:将数据从栈顶存放到栈中 函数名 Push()
4.出栈:将数据从栈顶中取出 函数名 Pop() // 函数命名方式要注意,不要和系统的冲突,最好用大小写命名
5.只取栈顶元素,但不出栈,函数名为top()
3.栈的存储方式
顺序栈 : 以顺序的存储方式(数组) 链式栈 : 以链表的存储方式
4.栈的接口(函数)实现
//--------------------
#define MAX_SLEN 1024
//-------------------
typedef int dataType;
//-------------------
// 定义栈结构
typedef struct
{
//保存元素数据的数组
dataType data[MAX_SLEN];
// 栈顶元素下标,用来获取栈里面的数据,-1表示空栈
int top;
}SqStack;
//---------------------
/*初始化栈,给栈分配空间*/
extern SqStack *Init_Stack();/*反初始化栈(释放栈空间,销毁)*/
extern void DeInit_Stack(SqStack *s);/*清空栈*/
extern void Clear_Stack(SqStack *s);/*判断栈是否为空*/
int StackIsEmpty(SqStack *s);/*获取栈元素个数(栈的大小)*/
extern int StackLen(SqStack *s);/*获取栈顶元素*/
extern dataType GetTop(SqStack *s);/*出栈,弹栈*/
extern dataType Pop(SqStack *s);/*入栈,压栈*/
extern bool Push(SqStack *s,dataType data);
具体代码:squenceStack.c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//--------------------
#define MAX_SLEN 1024
//-------------------
typedef int dataType;
//-------------------
// 定义栈结构
typedef struct
{
//保存元素数据的数组
dataType data[MAX_SLEN];
// 栈顶元素下标,用来获取栈里面的数据,-1表示空栈
int top;
}SqStack;
//---------------------
/*初始化栈,给栈分配空间*/
SqStack *Init_Stack();
/*反初始化栈(释放栈空间,销毁)*/
void DeInit_Stack(SqStack *s);
/*清空栈*/
void Clear_Stack(SqStack *s);
/*判断栈是否为空*/
int StackIsEmpty(SqStack *s);
/*获取栈元素个数(栈的大小)*/
int StackLen(SqStack *s);
/*获取栈顶元素*/
dataType GetTop(SqStack *s);
/*出栈,弹栈*/
dataType Pop(SqStack *s);
/*入栈,压栈*/
bool Push(SqStack *s,dataType data);
//---------------------------
/*初始化栈,给栈分配空间*/
SqStack *Init_Stack()
{
SqStack *s = malloc(sizeof(SqStack));
if(s == NULL)
{
return NULL;
}
// 初始栈栈顶元素下标,此栈为空
s->top = -1;
return s;
}
//---------------------------
/*反初始化栈(释放栈空间)*/
void DeInit_Stack(SqStack *s)
{
if(s)
{
s->top = -1;
free(s);
}
}
//---------------------------
/*清空栈*/
void Clear_Stack(SqStack *s)
{
// 如果s不为空
if(s)
{
s->top = -1;
}
}
//---------------------------
/*判断栈是否为空*/
int StackIsEmpty(SqStack *s)
{
if(s)
{
return s->top == -1; // 如果s->top == -1 返会1,否则返回 0
}
// 异常
return -1;
}
//---------------------------
/*获取栈元素个数(栈的大小)*/
int StackLen(SqStack *s)
{
if(s)
{
return s->top + 1;
}
return -1;
}
//---------------------------
/*获取栈顶元素*/
dataType GetTop(SqStack *s)
{
if(s)
{
return s->data[s->top];
}
return -1;
}
//---------------------------
/*出栈,弹栈*/
dataType Pop(SqStack *s)
{
if(s)
{
return s->data[(s->top)--];
}
return -1;
}
//---------------------------
/*入栈,压栈*/
bool Push(SqStack *s,dataType data)
{
if(s)
{
s->data[++(s->top)] = data;
return true;
}
return false;
}
//--------------------------------
int main()
{
// 初始化栈,给栈分配空间*/
SqStack *s = Init_Stack();
if(s == NULL)
{
perror("init stack failed:");
return -1;
}
// 循环将数据入栈
while(1)
{
dataType data;
scanf("%d",&data);
if(data == 0)
break;
// 入栈
bool ret = Push(s,data);
if(ret == false)
{
perror("push failed:");
return -1;
}
}
// 异常
if(StackIsEmpty(s) == -1)
return -1;
while(!StackIsEmpty(s))
{
printf("%d ",Pop(s));
}
printf("\n");
// 销毁栈
DeInit_Stack(s);
return 0;
}
刷题网站 : 力扣网站 洛谷网站