当前位置:网站首页>栈的表示和实现(C语言)
栈的表示和实现(C语言)
2022-07-26 00:03:00 【Perfectkn】
目录
栈的概念及结构
概念
栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。
结构
进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。
栈中的数据元素遵循后进先出的原则。
压栈:栈的插入操作叫做 进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫出栈。出数据也在栈顶。
练习题

这道题很简单,栈的数据元素规则就是后进先出,这组元素中,E是最后进来的所以它先出去,其次就是元素D。 所以选B
栈可以想象成一个管道,你从管道口往里放一个东西,之后如果你还想放东西是不是还是需要从管道口往里放?那么你第一次放的东西就越靠近里面了,你没取一次东西肯定是先从靠近管道口的位置取。
便于学习时,也可以看成弹夹。

这题答案是C。
A中顺序:1进--1出--234进完--4出--3出--2出
B中顺序:12进--2出--3进--3出--4进--4出--1出
D中顺序:123进--3出--4进--4出--2出--1出
栈的实现
推荐使用数组来实现栈
下面我们来看具体需要实现栈的哪些需求。
Stack.h
#pragma once
#include<stdio.h>
#include<stdbool.h>
#include<assert.h>
#include<stdlib.h>
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top;
int capacity;
}ST;
void StackInit(ST* ps); //初始化
void StackDestory(ST* ps); //销毁
void StackPush(ST* ps, STDataType x); //入栈
void StackPop(ST* ps); //出栈
STDataType StackTop(ST* ps); //返回栈顶元素
int StackSize(ST* ps); //求栈数据个数
bool StackEmpty(ST* ps); //判断栈是否为空一些解释:
#pragma once是预编译
头文件中assert是类型断言的头文件,断言函数assert(),只有当括号内判断为真时才执行程序下面的代码
定义的结构体中,top是栈顶指针,capacity是容量(不够的时候要增容)
下面是各接口具体实现
Stack.c
#include"Stack.h"
void StackInit(ST* ps) //初始化
{
assert(ps); //结构体指针不能为空
ps->a = malloc(sizeof(STDataType)*4); //动态内存开辟空间
if (ps->a == NULL)
{
printf("malloc fail\n");
exit(-1);
}
ps->capacity = 4;
ps->top = 0 ; //如果top给0意味着指向的是栈顶元素的下一个 ; -1表示指向栈顶元素
}
void StackDestory(ST* ps) //销毁
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->top = ps->capacity = 0;
}
void StackPush(ST* ps, STDataType x) //入栈
{
assert(ps);
if (ps->top == ps->capacity)
{
STDataType* tmp = realloc(ps->a, ps->capacity * 2 * sizeof(STDataType));
if (tmp == NULL)
{
printf("realloc fail\n");
exit(-1);
}
else
{
ps->a = tmp;
ps->capacity *= 2;
}
}
ps->a[ps->top] = x;
ps->top++;
}
void StackPop(ST* ps) //出栈
{
assert(ps);
//栈空了,调用Pop,直接中止程序报错
assert(ps->top > 0);
ps->top--;
}
STDataType StackTop(ST* ps) //返回栈顶元素
{
assert(ps);
assert(ps->top > 0);
return ps->a[ps->top - 1];
}
int StackSize(ST* ps)
{
assert(ps);
return ps->top;
}
bool StackEmpty(ST* ps) //判断栈是否为空
{
assert(ps);
return ps->top == 0;
}main.c测试接口
#include<stdio.h>
#include"Stack.h"
int main()
{
ST st; //声明一个结构体变量
StackInit(&st);//初始化栈
StackPush(&st, 1); //入栈数据1,2,3,4,5
StackPush(&st, 2);
StackPush(&st, 3);
StackPush(&st, 4);
StackPush(&st, 5);
while (!StackEmpty(&st)) //如果栈不为空,就可以取数据
{
printf("%d ", StackTop(&st));
StackPop(&st); //出栈
}
printf("\n");
StackDestory(&st);//销毁栈
return 0;
}测试内容可自行更改。

边栏推荐
- 二叉树——257. 二叉树的所有路径
- 安全文档归档软件
- Exercise (3) create a list set (both ArrayList and LinkedList)
- 栈与队列——150. 逆波兰表达式求值
- 二叉树——104. 二叉树的最大深度
- 06_ue4进阶_使用地形工具设置大地图
- Annotation @autowired source code analysis
- Iterator pattern of behavioral pattern
- SHIB(柴犬币)一月涨幅数百倍,百倍币需具备哪些核心要素?2021-05-09
- How does the server build a virtual host?
猜你喜欢

回溯——77. 组合

二叉树——101. 对称二叉树
34-SparkSQL自定义函数的使用、SparkStreaming的架构及计算流程、DStream转换操作、SparkStreaming对接kafka和offset的处理

你还在用浏览器自带书签?这款书签插件超赞

模块二作业

J9数字论:什么是DAO模式?DAO发展过程的阻碍

J9 number theory: what is Dao mode? Obstacles to the development of Dao

What is inode? It will help you understand inode and what help inode provides when creating and deleting files.

07_ UE4 advanced_ MP value of firing fireball and mechanism of attacking blood deduction

How to use yolov5 as an intelligent transportation system for red light running monitoring (1)
随机推荐
07_ue4进阶_发射火球扣mp值和攻击扣血机制
SIGIR‘22 推荐系统论文之图网络篇
服务器如何搭建虚拟主机?
C language (high level) program environment and preprocessing
行为型模式之责任链模式
06_ UE4 advanced_ Set up a large map using the terrain tool
Android solves the risk of database injection vulnerability
J9数字论:什么是DAO模式?DAO发展过程的阻碍
Unity—欧拉角,四元数
After entering www.baidu.com in the address bar
寻找链表的中间节点
二叉树——111. 二叉树的最小深度
二叉树——700.二叉搜索树中的搜索
URL address mapping configuration
Binary tree -- 700. Search in binary search tree
Getaverse,走向Web3的远方桥梁
Binary tree - 617. Merge binary tree
06_ue4进阶_使用地形工具设置大地图
Sequence traversal II of leetcode107 binary tree
34-SparkSQL自定义函数的使用、SparkStreaming的架构及计算流程、DStream转换操作、SparkStreaming对接kafka和offset的处理