#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
#define STACK_INT_SIZE 10               //存储空间初始分配量
#define STACKINCREMENT 5                //存储空间分配增量

typedef int ElemType;
typedef struct
{
    ElemType *top;                      //栈顶指针
    ElemType *base;                     //栈底指针
    int stacksize;                      //当前分配的存储空间
}Sqstack;

/*栈的初始化*/

int InitStack(Sqstack *s)
{
    s->base = (ElemType*)malloc(STACK_INT_SIZE*sizeof(ElemType));
    if(!s->base)                        //申请空间失败
    {
        return ERROR;
    }
    s->top = s->base;                   //置为空栈
    s->stacksize = STACK_INT_SIZE;      //设置当前栈空间大小
}

/*
入栈
入栈之前先要判断栈是否已满,判断栈是否满的语句s->top-s->base>=s->stacksize
如果已满则需要重新申请增加空间,同时栈顶指针的位置也需要发生变化 s->top+1

*/
int Push(Sqstack *s,ElemType e) //插入的e是一个具体的值
{
    if(s->top - s->base >= s->stacksize)
    {
        s->base = (ElemType*)realloc(s->base,s->stacksize+STACKINCREMENT);
        //realloc函数的用法
        //指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)
        if(!s->base)return ERROR;               //申请空间失败
        s->top = s->base + s->stacksize;        //重新设置当前栈顶指针
        s->stacksize += STACKINCREMENT;         //分配空间大小的改变
        /*
        s->stacksize += STACKINCREMENT;
        s->top = s->base + s->stacksize;

两条语句不能颠倒的原因:

realloc

进行再分配空间的时候,如果在原来的基础上还有需要空间大小,那么

得到的是连续的内存空间,如果空间不够,那就需要重新开辟一块空间。地址发生变化。

一开始进行初始化的时候,栈顶指针和栈底指针指向同一位置
        当空间满的时候,需要将栈顶指针移到最顶端,如果先执行

s->stacksize += STACKINCREMENT;

那么后面执行s->top = s->base + s->stacksize; 的时候
        栈顶指针就指向后来申请空间的顶端,指向发生错误。
        */
    }
    //e = *s->top;  等号两边赋值发生错误
    //*s->top = e;          (1)
    //s->top++;             (2)  插入数据后栈顶指针向上移
    *s->top++ = e;          //将(1)和(2)句合成一句,参照i++
    return OK;
}
/*
  出栈
  出栈首先要判断栈是否为空,判断栈是否为空的语句
  s->top == s->base;
  如果不为空,则出栈要需要将栈顶指针下移
*/

int Pop(Sqstack *s,ElemType *e)
//完成元素的出栈,只需要将地址传进去就可以
//不同于元素的入栈
{
    if(s->top == s->base)return ERROR;  //判断栈是否为空
    //s->top--;                         修改栈顶指针-1
    //*e = *s->top;                      e返回出栈元素的值
    *e = *--s->top;
    return OK;
}

int Gettop(Sqstack *s,ElemType *e)
{
    if(s->top == s->base)return ERROR;
    *e = *(s->top-1);   //只取栈顶元素值,不改变栈顶指针指向
    return OK;
}

【数据结构学习】顺序栈 C语言相关推荐

  1. Python数据结构学习笔记——栈

    目录 一.栈的定义和特性 (一)栈的定义 (二)栈的反转特性 二.实现分析步骤 三.栈的Python实现代码 四.栈的应用 (一)匹配圆括号 (二)匹配符号 (三)模2除法(十进制转二进制) (四)进 ...

  2. 数据结构遍历顺序栈_数据结构:顺序栈的实现

    数据结构:顺序栈的实现 1.快速开始 栈是一种遵循元素后进(Push)先出(Pop)规则的线性表,即最后加入的元素最先出来,它的实现可以用数组或者链表. 它的特点如下: 后入先出,先入后出. 除了头尾 ...

  3. 数据结构学习之栈求解n皇后问题

    数据结构学习之栈求解n皇后问题 0x1 目的 ​ 深入掌握栈应用的算法和设计 0x2 内容 ​ 编写一个程序exp3-8.cpp求解n皇后问题. 0x3 问题描述 即在n×n的方格棋盘上,放置n个皇后 ...

  4. 数据结构 创建顺序栈

    3.27数据结构--创建顺序栈 结构体定义 初始化栈 入栈 出栈 销毁栈 运行结果截图: 代码: /*3.27 顺序栈*/#define _CRT_SECURE_NO_WARNINGS #define ...

  5. 数据结构:顺序栈基本操作(入栈和出栈)C语言详解(转载)by解学武

    本文为解学武教程的免费章节 什么是顺序栈 顺序栈,即用顺序表实现栈存储结构.通过前面的学习我们知道,使用栈存储结构操作数据元素必须遵守 "先进后出" 的原则,本节就 "如 ...

  6. 数据结构《顺序栈》知识点详解+C语言完整代码-超详细

    顺序栈 栈 1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式 C语言代码实现 1. 顺序栈的表示 2. 结构体 3.初始化 4.入栈 5.出栈 6. 取栈顶元素 7.求长 8 ...

  7. 数据结构学习笔记——栈的基本知识和顺序存储结构实现栈(顺序栈)

    目录 一.栈 (一)栈的概念 (二)栈的排列 (三)共享栈 (四)栈的常见应用 二.顺序栈的定义 三.顺序栈的初始化 四.判断顺序栈是否为空栈 五.判断顺序栈是否为满栈 六.进栈(插入操作) 七.出栈 ...

  8. 【数据结构】顺序栈的实现(C语言)

    栈的基本概念及其描述 栈是一种特殊的线性表,规定它的插入运算和删除运算均在线性表的同一端进行,进行插入操作和删除操作的那一端称为栈顶,另一端称为栈底. 栈的插入操作和删除操作分别称为进栈和出栈. FI ...

  9. 插入栈顶元素c语言,详解数据结构之顺序栈的基本操做(C语言描述)

    1.栈是线性表的特例,所以栈的顺序存储其实也就是线性表顺序存储的简化,咱们称之为顺序栈,线性表是采用数组来实现的,所以顺序栈也采用数组来实现. 2.栈的结构定义:elementype类型根据实际状况而 ...

  10. 数据结构学习笔记(c语言版)

    文章目录 一.概念 1.基本术语 2.算法 3.时间复杂度 4.数据的逻辑结构 二.线性表 1.存储结构 2.基本操作 三.栈 1.存储结构 2.基本操作 3.实际应用 四.队列 1.存储结构 2.基 ...

最新文章

  1. c语言程序设计江宝钏实验六答案,《C语言程序设计》(江宝钏著)实验三答案.doc...
  2. Jfinal框架Modal获取属性值非常奇怪的问题
  3. 关于STM中SPI运用的NSS引脚解读
  4. 1203正规式转换为有穷自动机
  5. XML校验 黄色惊叹号!!!
  6. SpringBoot中的异步操作与线程池
  7. Javascript--闭包
  8. 机器码、序列号、认证码、注册码的生成算法(一)
  9. Linux搭建Weblogic集群
  10. Windows开机启动项/自启动项文件夹位置
  11. 中文文案排版 - 中文排版教程
  12. 戴维斯分校 计算机硕士,加州大学戴维斯分校计算机研究生录取条件是什么?
  13. mac电脑显示隐藏文件方法
  14. 水果店圈子:水果店开业前需要做的准备,水果店开业当天要注意哪些问题
  15. ffplay flv mp4 转_利用 FFmpeg 将 MP4 转成 FLV
  16. [高考真题]2012年普通高等学校招生全国统一考试 英语(四川卷)
  17. C++自制游戏《Fighter》
  18. HDU 1593: find a way to escape
  19. 浅谈宽带卫星通信系统
  20. 安卓8.1后台进程活动与后台流量限制策略记录

热门文章

  1. 初探可编程网关 Pipy
  2. 万字长文,结合电商支付业务一文搞懂DDD
  3. 百度程序员妻子质疑老公不忠!每天很晚回家!周五下班不回家,说领导带他喝酒!结婚一年就出轨?...
  4. 分布式id生成策略,我和面试官扯了一个半小时
  5. 被业务方投诉了!CTO直摇头:人际关系处理太差,不懂维护“情感账户”
  6. 你知道select count(*)底层究竟干了啥么?
  7. session一致性架构设计极简教程
  8. 程序员,有没有比较适合的任务管理方式?
  9. 每日站会要关注团队目标-Scrum中文网
  10. C语言循环选择还有,C语言第五讲,语句 顺序循环选择.(示例代码)