1.栈的相关概念

    栈是一种特殊的线性表, 其中只允许在固定的一端进行插入和删除元素.进行数据插入和删除的一端叫做栈顶, 另一端成为栈底. 不含任何元素的栈称为空栈, 栈又称为先进先出的线性表.

2. 顺序栈的结构

3. 顺序栈的具体操作

    (1). 数据结构

typedef char SeqStackType;typedef struct SeqStack
{SeqStackType *data;int size;int capacity;
}SeqStack;

    (2).顺序栈的初始化

void SeqStackInit(SeqStack* stack)
{if(stack == NULL){return;//非法输入}stack -> size = 0;stack -> capacity = 1000;stack -> data = (SeqStackType*)malloc(( stack -> capacity ) * sizeof(SeqStack));
}

    (3). 顺序栈的销毁

void SeqStackDestroy(SeqStack* stack)
{if(stack == NULL){return;//非法输入}free(stack -> data);stack -> size = 0;stack -> capacity = 0;
}

    (4). 顺序栈的扩容

void SeqStackReSize(SeqStack* stack)
{if(stack == NULL){return;}if(stack -> size < stack -> capacity){return;}stack -> capacity = stack -> capacity * 2 + 1;SeqStackType* new_ptr = (SeqStackType*)malloc(stack -> capacity);int i = 0;for(; i < stack -> size; i++){new_ptr[i] = stack -> data[i];}}

    (5). 顺序栈的入栈

void SeqStackPush(SeqStack* stack, SeqStackType value)
{if(stack == NULL){return;}if(stack -> size >= stack -> capacity){//扩容SeqStackReSize(stack);}stack -> data[stack -> size++] = value;
}

    (6). 顺序栈的打印

void TestPrintChar(SeqStack* stack, char* msg)
{printf("[ %s ]\n", msg);if(stack == NULL){return;}printf("size = %d\n", stack -> size);printf("capacity = %d\n", stack -> capacity);int i = 0;for(; i < stack -> size; i++){printf("[%c] ", stack -> data[i]);}printf("\n");
}

    (7). 顺序栈的出栈

void SeqStackPop(SeqStack* stack)
{if(stack == NULL){return;//非法输入}if(stack -> size == 0){return;//空栈}stack -> size--;
}

    (8). 取栈顶元素

int SeqStackGetFront(SeqStack* stack, SeqStackType* value)
{if(stack == NULL || value == NULL){return -1;//非法输入}if(stack -> size == 0){return -1;//空栈}*value = stack -> data[stack -> size - 1];return 0;
}

    (9). 测试代码


//以下为测试代码
void TestGetFront()
{TESTHEADER;SeqStack stack;SeqStackInit(&stack);SeqStackPush(&stack, 'a');SeqStackPush(&stack, 'b');SeqStackPush(&stack, 'c');SeqStackPush(&stack, 'd');TestPrintChar(&stack, "入栈四个元素");SeqStackType value;int ret = SeqStackGetFront(&stack, &value);printf("expected ret = 0, actual ret = %d\n", ret);printf("expected value = d, actual value = %c\n", value);
}void TestDestroy()
{TESTHEADER;SeqStack stack;SeqStackInit(&stack);SeqStackPush(&stack, 'a');SeqStackPush(&stack, 'b');SeqStackPush(&stack, 'c');SeqStackPush(&stack, 'd');TestPrintChar(&stack, "入栈四个元素");SeqStackDestroy(&stack);TestPrintChar(&stack, "销毁栈");
}void TestInit()
{TESTHEADER;SeqStack stack;SeqStackInit(&stack);TestPrintChar(&stack, "初始化栈");
}void TestPop()
{TESTHEADER;SeqStack stack;SeqStackInit(&stack);SeqStackPush(&stack, 'a');SeqStackPush(&stack, 'b');SeqStackPush(&stack, 'c');SeqStackPush(&stack, 'd');TestPrintChar(&stack, "入栈四个元素");SeqStackPop(&stack);SeqStackPop(&stack);TestPrintChar(&stack, "出栈两个元素");SeqStackPop(&stack);SeqStackPop(&stack);TestPrintChar(&stack, "再出栈两个元素");SeqStackPop(&stack);TestPrintChar(&stack, "对空栈进行出栈");}void TestPush()
{SeqStack stack;SeqStackInit(&stack);SeqStackPush(&stack, 'a');SeqStackPush(&stack, 'b');SeqStackPush(&stack, 'c');SeqStackPush(&stack, 'd');TestPrintChar(&stack, "入栈");
}int main()
{TestInit();TestPush();TestPop();TestGetFront();TestDestroy();return 0;
}

顺序表实现栈相关操作相关推荐

  1. 栈——用顺序表实现栈操作

    一.线性表特点 线性表:由0个或者多个数据元素组成的有限序列 除了第一个节点(头节点),都有前驱节点 除了最后一个节点(尾节点),都有后继节点 线性表主要由顺序存储结构或者链式存储结构 一般线性表:可 ...

  2. 用顺序表实现学生信息管理系统

    用顺序表实现学生信息管理系统 问题描述: 定义一个包含学生信息(学号,姓名,成绩)的顺序表,使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息: (2) 逐个显示学生表中所有学生的相关信息 ...

  3. 顺序表实现学生管理系统

    定义一个包含学生信息(学号,姓名,成绩)的顺序表和链表,使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息: (2) 逐个显示学生表中所有学生的相关信息: (3) 根据姓名进行查找,返回此 ...

  4. 顺序表讲解和顺序表实现增删查改

    前言 顺序表是一种参见的数据结构 特点:类似数组的储存,需要预先开辟空间已备数据插入.(1)同时顺序表也因此会存在和数组同样的问题(例如:越界)(2)同时因为其类似与数组的结构给二分查找这种算法提供了 ...

  5. 约瑟夫环c语言代码顺序存储,顺序表实现约瑟夫环地问题,C语言.doc

    顺序表实现约瑟夫环地问题,C语言 计算机科学与工程学院 PAGE PAGE 2 <算法与数据结构>试验报告 计算机科学与工程学院 <算法与数据结构>试验报告[一] 专业班级 1 ...

  6. c++:用顺序表实现简单的栈

    main.cpp #include<iostream> #include<string> #include"Stack.hpp" using namespa ...

  7. 【python】队列——用顺序表实现队列操作

    一.队列 队列特点:队尾入队,队首出队,先进先出 二.队列要实现的操作 1.创建一个空队列 class Queue:def __init__(self)self.item=[] 2.添加一个元素ite ...

  8. 解决顺序表实现队列的假溢出的循环队列

    循环队列的参考视频:https://www.bilibili.com/video/BV1nJ411V7bd?p=60 问题:什么是顺序队列的假溢出? 从队首倒到队尾完全占用了分配的空间,是溢出.相反, ...

  9. 顺序表实现 电子地图管理系统

    项目简介: 开发一个对电子地图数据进行管理的系统,原始数据按照地图数据格式存储在一个二进制 文件中,每个道路都是被赋予了独一无二的编号,这个编号叫做 LinkID,在这个文件中存储着 文件中,每个道路 ...

最新文章

  1. python字符串删除,列表删除以及字典删除的总结
  2. python3精要(43)--变量注释
  3. 数据结构与算法 / 排序算法(3)
  4. [网络安全自学篇] 三十四.Windows系统安全缺陷之5次Shift漏洞启动计算机机理分析
  5. vue - v-if 注意点
  6. 立体视觉(Stereo Vision)-本征矩阵(essential matrix)和基本矩阵(fundamental matrix)
  7. DataWorks支持PyODPS类型任务
  8. Laravel 5.4: 特殊字段太长报错 420000 字段太长
  9. uCharts图表在小程序中的使用
  10. 8. JavaScript 全局对象
  11. JS中更改样式属性或者更改类名
  12. arduino蓝牙通讯代码_arduino蓝牙通讯
  13. vue.js+muse-ui制作在线简历编辑
  14. codeforces 268E Playlist(数学期望)
  15. Django微信抢票大作业总结
  16. word批注怎么删除计算机名字,Word批注怎样删掉用户名
  17. 使用Qt合并图片的算法
  18. Kinect for Windows SDK 1.6的改进及新特性
  19. 【ProVerif学习笔记】6:握手协议(handshake protocol)建模
  20. WIN32 完整的开发流程

热门文章

  1. 项目总结:华南师范大学校园开发教育android客户端总结
  2. ASP.NET MEMBERSHIP的XML配置
  3. Windows 7 / Vista 分区问题
  4. Javascript--File对象
  5. java 日期类代码_java 日期时间处理类
  6. java usb 无驱打印_Windows Usb 无驱动打印
  7. echarts中triggeron与trigger不能同时出现吗_好物|痛风、血糖高、虚不受补能吃它吗?你想知道的阿胶十问十答一锅出!...
  8. 大根堆的删除c语言,大根堆和小根堆的C语言实现
  9. java代码实现解压文件_Java压缩/解压文件的实现代码
  10. c语言case多语句的取值,Switch Case语句中多个值匹配同一个代码块的写法