C语言提高篇-数据结构~栈
一、栈的基本特征和实现
1、 基本特征
具有后进先出特性的数据结构
LIFO
增加/删除元素都在数据结构的同一端操作,栈顶
二、 基本操作
创建 销毁 …
1、 使用顺序存储结构实现栈的基本操作
示例如下:
//使用顺序存储结构实现栈的基本操作
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//定义栈的数据类型
typedef struct
{
//int arr[5];
int* arr; //记录顺序结构存储空间首地址
int len; //记录顺序存储空间的大小
int top; //记录栈顶位置的下标
}Stack;
//实现栈的创建
Stack* create(int len);
//实现栈的销毁
void destroy(Stack* ps);
//判断栈是否为满
bool full(Stack* ps);
//判断栈是否为空
bool empty(Stack* ps);
//实现入栈操作
void push(Stack* ps,int data);
//遍历栈中的所有元素
void travel(Stack* ps);
//计算栈中元素的个数
int size(Stack* ps);
//查看栈顶元素的值
int peek(Stack* ps);
//实现出栈的操作
int pop(Stack* ps);
int main(void)
{
//栈的创建
Stack* ps = create(5);
/*
if(full(ps))
{
printf("栈已经满了\n");
}
else
{
printf("栈没有满\n");
}
*/
printf("%s\n",full(ps)?"栈满了":"栈没有满"); //栈没有满
printf("%s\n",empty(ps)?"栈空了":"栈没有空"); //栈空了
printf("---------------------\n");
int i = 0;
for(i = 1; i < 7; i++)
{
push(ps,10*i+i);
}
travel(ps);// 11 22 33 44 55
printf("---------------------\n");
printf("栈中的元素个数是:%d\n",size(ps)); // 5
printf("栈中的栈顶元素是:%d\n",peek(ps));// 55
printf("出栈的元素是:%d\n",pop(ps));//55
printf("栈中的元素个数是:%d\n",size(ps)); // 4
printf("栈中的栈顶元素是:%d\n",peek(ps)); // 44
travel(ps); // 11 22 33 44
//栈的销毁
destroy(ps);
ps = NULL;
return 0;
}
//实现出栈的操作
int pop(Stack* ps)
{
//判断栈是否为空
if(empty(ps))
{
return -1;//表示出栈失败
}
// 标记该元素所在位置为无效元素位置
return ps->arr[--ps->top];
}
//计算栈中元素的个数
int size(Stack* ps)
{
return ps->top;
}
//查看栈顶元素的值
int peek(Stack* ps)
{
/*
//判断栈是否为空
if(empty(ps))
{
return -1;//表示查看失败
}
return ps->arr[ps->top-1];
*/
return empty(ps)?-1:ps->arr[ps->top-1];
}
//遍历栈中的所有元素
void travel(Stack* ps)
{
printf("栈中的元素有:");
int i = 0;
for(i = 0; i < ps->top; i++)
{
printf("%d ",ps->arr[i]);
}
printf("\n");
}
//实现入栈操作
void push(Stack* ps,int data)
{
//判断栈是否为满
if(full(ps))
{
printf("栈已经满了,入栈失败\n");
return; //结束当前函数
//exit(0); 结束整个程序
}
//ps->arr[ps->top] = data;
//ps->top++;
ps->arr[ps->top++] = data;
}
//判断栈是否为满
bool full(Stack* ps)
{
/*
if(ps->top == ps->len)
{
return true;//表示栈满了
}
return false; //表示栈没有满
*/
return ps->top == ps->len;
}
//判断栈是否为空
bool empty(Stack* ps)
{
return 0 == ps->top;
}
//实现栈的销毁
void destroy(Stack* ps)
{
free(ps->arr);
ps->arr = NULL;
free(ps);
ps = NULL;
}
//实现栈的创建
Stack* create(int len)
{
// Stack stack;
// 永远不要返回一个局部变量的地址
// return &stack;
//创建栈
Stack* ps = (Stack*)malloc(sizeof(Stack));
//初始化栈中的成员
ps->arr = (int*)malloc(sizeof(int)*len);
ps->len = len;
ps->top = 0;
//返回创建出来的栈的首地址
return ps;
}