数据结构 - 顺序栈的实行(C语言)
一、什么是栈?
在我们软件应用中,栈这种后进先出数据结构的应用是非常普遍的。比如 Word、 Photoshop 等文档或图像编辑软件中, 都有撤销(undo)的操作,也是用栈这种方式来实现的。
| 栈(stack)是限定仅在表尾进行插入和删除操作的线性表。 |
我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。 栈又称为后进先出(Last In Filrst Out) 的线性表,简称 LlFO 结构。
栈的插入操作,叫作进栈,也称压栈、入栈。类似子弹入弹夹,如下图-左所示。栈的删除操作,叫作出栈,也有的叫作弹栈。
二、什么是顺序栈?
顺序栈:是指利用顺序存储结构实现的栈。线性栈可以用数组来实现,对于栈这种只能一头插入删除的线性表来说,用数组哪一端来作为栈顶和栈底比较好?
对,没错,下标为 0 的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作栈底。我们定义一个 top 变量来指示栈顶元素在数组中的位置,若存储栈的长度为 StackSize,则栈顶位置 top 必须小于 StackSize。当栈存在一个元素时,top 等于 0,因此通常把空栈的判定条件定为 top 等于 -1。
来看栈的结构定义:
typedef int ElemType; /* ElemType类型根据实际情况而定,这里假设为int */
/* 顺序栈结构 */
typedef struct
{
ElemType data[MAXSIZE];
int top; /* 用于栈顶指针 */
}SeqStack;
若现在有一个栈,StackSize 是 5,则栈普通情况、空栈和栈满的情况示意图如下图所示:

- 栈空时:栈顶指针(top)= -1;
- 栈满时:栈顶指针(top)= MAXSIZE-1;
- 栈未满:就是栈中存在元素,top 指针还未达到 MAXSIZE-1。
三、基本操作
3.1 初始化栈操作
实现代码如下:
// 初始化栈操作
Status initStack(SeqStack **stack)
{
*stack = (SeqStack *)malloc(sizeof(SeqStack));
(*stack)->top = -1;
return TRUE;
}
3.2 进栈操作
进栈的示意图如下:

实现进栈只需要两步:
- 判断栈是否已经满了,如果满了当然就入不了栈。
- 栈顶指针 +1,在新栈顶位置存入要进栈的元素。
实现代码如下:
// 进栈操作
Status push(SeqStack *stack, const ElemType e)
{
if (stack->top == MAXSIZE - 1) // 判断是否栈满
{
return FALSE;
}
stack->top++; // 栈顶指针加1
stack->data[stack->top] = e; // 将新插入元素赋值给栈顶空间
return TRUE;
}
3.3 出栈操作
出栈的示意图如下:

实现出栈也只需要两步:
- 判断栈是否为空,里面没有数据先出栈也没有。
- 将栈顶元素出栈,栈顶指针 -1。
实现代码如下:
// 出栈操作
Status pop(SeqStack *stack, ElemType *e)
{
if (stack->top == -1) // 判断是否空栈
return FALSE;
*e = stack->data[stack->top]; // 将要删除的栈顶元素赋值给e
stack->top--; // 栈顶指针减1
return TRUE;
}
3.4 遍历栈操作
实现代码如下:
// 遍历栈操作
Status traverseStack(SeqStack *stack)
{
for (int i = 0; i <= stack->top; i++)
printf("%d ", stack->data[i]);
printf("\n");
return TRUE;
}
四、完整程序
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 /* 存储空间初始分配量 */
typedef int Status;
typedef int ElemType; /* ElemType类型根据实际情况而定,这里假设为int */
/* 顺序栈结构 */
typedef struct
{
ElemType data[MAXSIZE];
int top; /* 用于栈顶指针 */
}SeqStack;
Status initStack(SeqStack **stack); // 初始化栈操作
Status push(SeqStack *stack, const ElemType e); // 进栈操作
Status pop(SeqStack *stack, ElemType *e); // 出栈操作
Status traverseStack(SeqStack *stack); // 遍历栈操作
Status clearStack(SeqStack *stack); // 清空栈操作
Status isEmpty(SeqStack *stack); // 判断是否为空
Status getTop(SeqStack *stack, ElemType *e); // 获得栈顶元素
int getLength(SeqStack *stack); // 获取栈的长度
// 初始化栈操作
Status initStack(SeqStack **stack)
{
*stack = (SeqStack *)malloc(sizeof(SeqStack));
(*stack)->top = -1;
return TRUE;
}
// 进栈操作
Status push(SeqStack *stack, const ElemType e)
{
if (stack->top == MAXSIZE - 1) // 判断是否栈满
{
return FALSE;
}
stack->top++; // 栈顶指针加1
stack->data[stack->top] = e; // 将新插入元素赋值给栈顶空间
return TRUE;
}
// 出栈操作
Status pop(SeqStack *stack, ElemType *e)
{
if (stack->top == -1) // 判断是否空栈
return FALSE;
*e = stack->data[stack->top]; // 将要删除的栈顶元素赋值给e
stack->top--; // 栈顶指针减1
return TRUE;
}
// 遍历栈操作
Status traverseStack(SeqStack *stack)
{
for (int i = 0; i <= stack->top; i++)
printf("%d ", stack->data[i]);
printf("\n");
return TRUE;
}
// 清空栈操作
Status clearStack(SeqStack *stack)
{
stack->top = -1;
return TRUE;
}
// 判断是否为空
Status isEmpty(SeqStack *stack)
{
return stack->top == -1 ? TRUE : FALSE;
}
// 获得栈顶元素
Status getTop(SeqStack *stack, ElemType *e)
{
if (stack->top == -1)
return FALSE;
else
*e = stack->data[stack->top];
return TRUE;
}
// 获取栈的长度
int getLength(SeqStack *stack)
{
return stack->top + 1;
}
int main()
{
// 初始化栈
SeqStack *stack;
if (initStack(&stack) == TRUE)
printf("初始化顺序栈成功!\n\n");
// 入栈操作
for (int j = 1; j <= 10; j++)
push(stack, j);
printf("入栈操作(0-10)!\n\n");
// 出栈操作
int e;
pop(stack, &e);
printf("弹出的栈顶元素e=%d\n\n", e);
// 遍历栈
printf("遍历栈,栈中元素依次为:");
traverseStack(stack);
printf("\n");
// 获得栈顶元素
getTop(stack, &e);
printf("栈顶元素 e=%d 栈的长度为%d\n\n", e, getLength(stack));
// 判断是否为空栈
printf("栈空否:%d(1:空 0:否)\n\n", isEmpty(stack));
// 清空栈
clearStack(stack);
printf("清空栈后,栈空否:%d(1:空 0:否)\n\n", isEmpty(stack));
return 0;
}
输出结果如下图所示:

参考:
《大话数据结构 - 第4章》 栈与队列
数据结构 - 顺序栈的实行(C语言)的更多相关文章
- 数据结构 - 链栈的实行(C语言)
数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它 ...
- 顺序栈的基本操作(C语言)
由于现在只学了C语言所以就写这个C语言版的栈的基本操作 这里说一下 :网上和书上都有这种写法 int InitStack(SqStack &p) &p是取地址 但是这种用法好像C并不 ...
- 数据结构 - 顺序栈的实现 C++
顺序栈封装 C++ 使用C++对顺序栈进行了简单的封装,实现了栈的基本操作 封装方法: pop(),top(),size(),empty(),push() 代码已经过测试 #pragma once # ...
- 数据结构 - 顺序队列的实行(C语言)
数据结构-顺序队列的实现 1 顺序队列的定义 线性表有顺序存储和链式存储,队列作为一种特殊的线性表,也同样存在这两种存储方式.我们先来看队列的顺序存储结构. 队列的顺序储存结构:用数组存储队列,为了避 ...
- 数据结构——顺序栈(sequence stack)
/* sequenceStack.c */ /* 栈 先进后出(First In Last Out,FILO)*/ #include <stdio.h> #include <stdl ...
- 数据结构--顺序栈--C++实现
#include <iostream> #define MaxSize 5000 using namespace std; template <typename T> clas ...
- C++语言实现顺序栈
C++语言实现顺序栈 在写C语言实现顺序栈的时候,我已经向大家介绍了栈的特点以及介绍了栈的相关操作,并利用C语言实现了相关算法.在这里小编就不在继续给大家介绍了,需要温习的可以去我的博客看看.在这篇博 ...
- 【C#】【数据结构】005-栈:顺序栈
C#数据结构:顺序栈 1.自定义顺序栈结构: /// <summary> /// 顺序栈 /// </summary> /// <typeparam name=" ...
- 数据结构与算法之顺序栈C语言实现
顺序栈是一种特殊的顺序表,主要操作是入栈和出栈.将顺序表加一些特定限制,就成了顺序栈. 注: 1.顺序栈C语言实现: 2.按较简单的方式实现,主要帮助理解,可在此基础上修改,更加完善: 3.提供几个简 ...
随机推荐
- spring mvc get请求也可以接受DTO对象
spring mvc get请求也可以接受DTO对象,比如:url上面你还是将参数&符号连接起来,并自动封装进一个DTO对象里. 只有@RequestBody注解spring mvc才会从ht ...
- influxDB系列(二)
来源于我在一个influxDB的qq交流群中的提问, 然后有个人 提了一个问题---->触发了我的思考!! :) 哈哈 自己的每一次说出一个回答,都是一次新的思考,也都进行了一些查阅资料,思考, ...
- 谈一谈关于NODE里的N管理
模块可能与当前的NODE版本不和,NODE升级问题? 一切尽在掌握 1.首先设置好PATH(你安装的目录) Debian系列: sudo gedit /etc/profile Redhat系列: su ...
- 【Mongodb教程 第七课 】MongoDB 查询文档
find() 方法 要从MongoDB 查询集合数据,需要使用MongoDB 的 find() 方法. 语法 基本的find()方法语法如下 >db.COLLECTION_NAME.find() ...
- 使用Blender批量导出/转换模型
2.4版本号的Blender API和2.5以上版本号的API有非常大的不同,这里仅仅是提供了思路和2.4版本号的导出方案. 先提供一个脚本,这个是由Blender调用的.用于转换Ogre的Mesh文 ...
- 如何更有效的消灭watchdogs挖矿病毒?华为云DCS Redis为您支招
漏洞概述 近日,互联网出现watchdogs挖矿病毒,攻击者可以利用Redis未授权访问漏洞入侵服务器,通过内外网扫描感染更多机器.被感染的主机出现 crontab 任务异常.系统文件被删除.CPU ...
- 基于FFMPEG SDK流媒体开发1---解码媒体文件流信息
近期项目涉及到流媒体等开发,因为有过开发经验深知其难度所在,没办法仅仅能又一次拾起,最新版的SDK被改的一塌糊涂,只是大体的开发思路都是一样的,看多少书查多少资料都无用,一步一步的编写代码 才是学好的 ...
- 为Html.EditorForModel自定义模版
对于MVC视图渲染来说,大家应该不会陌生,但对于模型的渲染,不知道是否听说过,主要是说Model通过它属性的相关特性(DataType,UIHint)来将它们自动渲染到View上,这是一个比较不错的技 ...
- HTML5_路径
<!DOCTYPE html> <hmtl> <html lang="zh-cn"> <head> <meta charse ...
- mysql数据库存放路径
在你的my.ini 文件中定义的参数 datadir 指定的目录中. SQL code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 mysql> select @@da ...