#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>

using std::cout;

typedef int SElemType;
const int STACK_INIT_SIZE = 100;
const int STACKINCREMENT = 10;

typedef struct {
    SElemType *base;
    SElemType *top;
    int stacksize;
} SqStack;

bool InitStack(SqStack &S);

bool DestoryStack(SqStack &S);

bool ClearStack(SqStack &S);

bool StackEmpty(SqStack S);

int StackLength(SqStack S);

bool GetTop(SqStack S, SElemType &e);

bool Push(SqStack &S, SElemType e);

bool Pop(SqStack &S, SElemType &e);

bool StackTraverse(SqStack S);

int main() {
    SqStack s;
    InitStack(s);
    Push(s, 5);
    Push(s, 6);
    Push(s, 7);
    Push(s, 8);
    int a;
    Pop(s, a);
    cout << a << std::endl;
    GetTop(s, a);
    cout << a << std::endl;

    if (StackEmpty(s)) {
        printf("is empty!\n");
    } else {
        printf("is not empty!\n");
    }
    SElemType b;
    printf("%d\n", StackLength(s));
    StackTraverse(s);
    while (!StackEmpty(s)) {
        int b;
        Pop(s, b);
        cout << b << std::endl;
    }
    ClearStack(s);
    DestoryStack(s);
}

bool StackTraverse(SqStack S) {
    if (S.top == S.base) {
        return false;
    }
    while (S.base < S.top) {
        printf("%d\t", *(S.base++));
    }
    printf("\n");
    return true;
}

bool DestoryStack(SqStack &S) {
    free(S.base);
    S.base = NULL;
    return true;
}

bool ClearStack(SqStack &S) {
    S.top = S.base;
    return true;
}

int StackLength(SqStack S) {
    if (S.base == S.top) {
        return 0;
    }
    return (int) (S.top - S.base);
}

bool StackEmpty(SqStack S) {
    if (S.top == S.base) {
        return true;
    }
    return false;
}

bool InitStack(SqStack &S) {
    S.base = (SElemType *) malloc(sizeof(SElemType) * STACK_INIT_SIZE);
    if (!S.base) {
        exit(OVERFLOW);
    }
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return true;
}

bool GetTop(SqStack S, SElemType &e) {
    if (S.top == S.base) {
        return false;
    }
    e = *(S.top - 1);
    return true;
}

bool Push(SqStack &S, SElemType e) {
    if (S.top - S.base >= S.stacksize) {
        S.base = (SElemType *) realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
        if (!S.base) {
            exit(OVERFLOW);
        }
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *S.top++ = e;
    return true;
}

bool Pop(SqStack &S, SElemType &e) {
    if (S.top == S.base) {
        return false;
    }
    e = *--S.top;
    return true;
}

数据结构C语言版-栈的更多相关文章

  1. c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...

  2. 数据结构C语言版 有向图的十字链表存储表示和实现

    /*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...

  3. 数据结构C语言版 表插入排序 静态表

    数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./*  数据结构C语言版 表插入排序  算法10.3 P267-P270  编译 ...

  4. 数据结构C语言版 弗洛伊德算法实现

    /* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...

  5. 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

    <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑  链接☛☛☛ <数据结构>课本源码合辑 习题集全解析  链接☛☛☛  ...

  6. 【数据结构(C语言版)系列二】 栈

    栈和队列是两种重要的线性结构.从数据结构角度看,栈和队列也是线性表,但它们是操作受限的线性表,因此,可称为限定性的数据结构.但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型. 栈的定 ...

  7. 深入浅出数据结构C语言版(8)——后缀表达式、栈与四则运算计算器

    在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #de ...

  8. 深入浅出数据结构C语言版(7)——特殊的表:队列与栈

    从深入浅出数据结构(4)到(6),我们分别讨论了什么是表.什么是链表.为什么用链表以及如何用数组模拟链表(游标数组),而现在,我们要进入到对线性表(特意加了"线性"二字是因为存在多 ...

  9. 数据结构(C语言版)顺序栈相关算法的代码实现

    这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的 ...

随机推荐

  1. C# 异步示例代码

    在 使用BackgroundWorker组件 一文中,阐述了在Winform编程中,使用BackgroundWorker组件实现异步调用,本文主要讲述利用委托实现异步. 以下描述摘抄于MSDN: 异步 ...

  2. jQuery之animate中的queue

    queue.dequeue clearQueue  清空 用队列完成之前动画的操作:

  3. python表格导出--xlwt的使用

    xlwt可以用来导出excel表,下面介绍一下它的用法: 1. 安装xlwt模块 pip install xlwt 2. 使用xlwt模块:后端接口编写 import xlwt #导出表格接口 def ...

  4. 需要重写URL但请求的目录不存在报404

    用的是asp.net webform,在global.asax的application_beginrequest中写的代码 很简单的一个需求,在url中输入http://www.test.com/lc ...

  5. dotnet不是内部或外部的命令,也不是可运行的程序或批处理文件

    该问题是由于电脑环境变量配置错误所导致.最初在网上查找的方法,是在系统环境变量path中添加以下语句: %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\ ...

  6. 使用电脑ODBC测试数据库连接方法

    使用电脑ODBC测试数据库连接方法 一.打开电脑的控制面板——管理工具——数据源(ODBC),在用户dsn页面中点击添加按钮,选择IBM DB2 ODBC DRIVER,点击完成. 二.在弹出的配置页 ...

  7. [Solution] 969. Pancake Sorting

    Difficulty: Medium Problem Given an array A, we can perform a pancake flip: We choose some positive ...

  8. 《CSAPP》读书笔记

    第一章 第二章 第三章 第四章 第五章 第六章 第七章 链接 可重定位目标文件 符号和符号表 符号解析 第八章 第九章 虚拟存储器 虚拟存储器 页表.页命中.缺页 地址翻译 第十章 第十一章 第十二章 ...

  9. mysql出现“Incorrect key file for table”解决办法

    本文来自: https://www.cnblogs.com/zjoch/archive/2013/08/19/3267131.html 今天mysql突然出现以下错误: mysql> selec ...

  10. Vue的从入门到放弃

    此贴仅记录vue学习路程中遇见的大大小小,形形色色的问题 1.  vue自动打开浏览器配置: 当使用vue 脚手架搭建项目后启动npm run dev,会出现 但是不会自动打开浏览器的,这时候去con ...