数据结构-栈

1、栈的基本概念

1、栈是特殊的线性表:只允许在一端进行插入和删除操作

2、栈的逻辑结构就是线性结构,栈的存储结构既可以是顺序存储,也可以是链式存储

3、栈顶:允许进行插入和删除的一端(最上面的为栈顶元素)

4、栈底:不允许进行插入和删除的一端(最下边的栈底元素)

5、空栈:不含任何元素的空表

6、特点:先进后出 、 LIFO(Last in First Out)

2、栈的基本操作

创建、销毁、压栈(进栈)、弹栈(出栈)、判空、遍历

3、栈的创建

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdbool.h>

#define MAX_SIZE 100

//顺序栈的创建方式:利用数组 和 利用指针

//利用数组创建栈

typedef int eleT;

typedef struct Satck {

eleT data[MAX_SIZE];//存放栈中的元素

int top;//存放栈顶元素的索引

int bottom;//存放栈底元素的索引

}ST;

void Init_Stack(ST* s);

bool is_empty(ST s);

void push_stack(ST* s, eleT val);

void print_stack(ST s);

void pop_stack(ST* s);

void clear_stack(ST* s);

int main()

{

eleT val = 0;

ST s; //定义栈变量

int order = 0;

printf("操作指令:\n");

printf("1、初始化\n");

printf("2、压栈\n");

printf("3、弹栈\n");

printf("4、遍历\n");

printf("5、判空\n");

printf("6、清0\n");

while (1)

{

printf("请输入指令:");

scanf("%d", &order);

switch (order)

{

case 1:

//初始化

//1、初始化一个空栈

Init_Stack(&s);

break;

case 2:

//压栈

printf("请输入要压栈的元素:");

scanf("%d", &val);

push_stack(&s, val);

break;

case 3:

//弹栈 弹出栈顶元素,

//思路逻辑:把栈顶元素删除,并打印出来即可

pop_stack(&s);

break;

case 4:

//遍历

print_stack(s);

break;

case 5:

//判空

is_empty(s) ? printf("空栈\n") : printf("不是空栈\n");

break;

case 6:

//清0

//清0逻辑:不改变栈顶和栈底元素位置,只是把栈内元素设置为0

clear_stack(&s);

break;

case 7:

//退出

return;

default:

printf("指令有误,重新输入\n");

}

}

return 0;

}

//1、初始化一个空栈

//空栈的特点:top==-1 bottom == -1

void Init_Stack(ST* s)

{

s->bottom = -1;

s->top = -1;

printf("初始化成功\n");

}

//2、压栈

void push_stack(ST* s, eleT val)

{

//先判断栈是否已满

if (s->top == MAX_SIZE - 1)

{

//栈已满

printf("栈已满,无法压栈\n");

return;

}

//再判断是不是空栈

if (is_empty(*s))

{//空栈

s->bottom++;

}

s->top++;

s->data[s->top] = val;//放入新元素

printf("压栈成功\n");

}

//3、判空 判断是不是空栈 是空栈返回1(true) 不是空栈返回0(false)

bool is_empty(ST s)

{

if (s.top == -1)

{ //是空栈

return true;

}

//不是空栈

return false;

}

//4、栈的遍历

void print_stack(ST s)

{

//判断是否是空栈

if (is_empty(s))

{

printf("空栈\n");

return;

}

for (int i = s.bottom; i <= s.top; i++)

{

printf("%d ", s.data[i]);

}

printf("\n");

}

//弹栈

//把栈顶元素删除,并打印出来即可

void pop_stack(ST* s)

{

//判断你是否是空栈

if (is_empty(*s))

{

printf("空栈\n");

return;

}

//要考虑到弹栈之前,栈内是否只有一个元素

eleT topele = s->data[s->top];// 先把栈顶元素保存一下

if (s->top == 0)

{

//说明栈内只有一个元素

s->bottom--;

}

s->top--;

printf("弹出的栈顶元素为:%d\n", topele);

}

//清0逻辑:不改变栈顶和栈底元素位置,只是把栈内元素设置为0

void clear_stack(ST* s)

{

if (is_empty(*s))

{

printf("空栈\n");

return;

}

for (int i = s->bottom; i <= s->top; i++)

{

s->data[i] = 0;

}

printf("清0成功\n");

}

相关推荐
2401_873479403 小时前
如何利用IP查询定位识别电商刷单?4个关键指标+工具配置方案
开发语言·tcp/ip·php
我爱cope3 小时前
【从0开始学设计模式-10| 装饰模式】
java·开发语言·设计模式
菜鸟学Python3 小时前
Python生态在悄悄改变:FastAPI全面反超,Django和Flask还行吗?
开发语言·python·django·flask·fastapi
浪浪小洋4 小时前
c++ qt课设定制
开发语言·c++
charlie1145141914 小时前
嵌入式C++工程实践第16篇:第四次重构 —— LED模板,从通用GPIO到专用抽象
c语言·开发语言·c++·驱动开发·嵌入式硬件·重构
故事和你914 小时前
洛谷-数据结构1-4-图的基本应用1
开发语言·数据结构·算法·深度优先·动态规划·图论
程序猿编码5 小时前
给你的网络流量穿件“隐形衣“:手把手教你用对称加密打造透明安全隧道
linux·开发语言·网络·安全·linux内核
aq55356006 小时前
编程语言三巨头:汇编、C++与PHP大比拼
java·开发语言
aq55356006 小时前
PHP vs Python:30秒看懂核心区别
开发语言·python·php
我是无敌小恐龙6 小时前
Java SE 零基础入门Day01 超详细笔记(开发前言+环境搭建+基础语法)
java·开发语言·人工智能·opencv·spring·机器学习