线性结构的应用-栈

作者: 黄一倚 | 来源:发表于2018-07-26 18:13 被阅读17次

定义

  • 栈是一种运算受限的线性表
  • 其限制是仅允许在表的一端进行插入和删除运算
  • 允许进行操作的一端被称为栈顶,另一端则称为栈底

主要操作

  • 压栈 / 入栈 / 进栈:插入元素
  • 出栈 / 退栈:删除元素

性质

  • 先进后出:最先进栈的元素,只可以最后出栈

栈的分类

  • 静态栈:用数组来实现的栈
  • 动态栈:用链表来实现的栈

动态栈的实现

栈结构
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <stdbool.h>
/**
    定义结点数据类型
*/
typedef struct Node{
    int data;
    struct Node * pNext;
}NODE,*PNODE;

/**
    定义栈结构
*/
typedef struct stack{
    PNODE pTop;
    PNODE pBottom;
}STACK,*PSTACK;

/**
    声明函数
*/
void init_stack(PSTACK); //初始化一个栈,即构建一个栈结构
void push_stack(PSTACK,int); //把一个元素压栈
void traverse_stack(PSTACK); //遍历栈
bool isEmpty(PSTACK);   //判断栈空
bool pop_stack(PSTACK,int *); //出栈
void clear_stack(PSTACK);   //清空栈

int main()
{
    STACK s; //定义一个栈
    //测试 初始化栈
    init_stack(&s);

    //测试 压栈
    push_stack(&s,2);
    push_stack(&s,5);
    push_stack(&s,4);
    push_stack(&s,8);

    //测试 遍历栈
    traverse_stack(&s);


    //测试清空栈
    clear_stack(&s);

    //测试 出栈
    int element;  //保存删除的元素
    if(pop_stack(&s,&element)){
        printf("删除成功,你删除的元素是:%d \n",element);
    }else{
        printf("删除失败!\n");
    }
    traverse_stack(&s);
    printf("Hello world!\n");
    return 0;
}

/**
    初始化栈
*/
void init_stack(PSTACK pStack){
    //为栈生成一个不存放任何数据的头结点,并且用栈栈底指针指向它
    pStack->pBottom = (PNODE)malloc(sizeof(NODE));
    if(pStack->pBottom == NULL){
        printf("内存分配失败,程序结束!");
        exit(-1);
    }
    //内存分配成功,也把栈顶指针指向头结点
    pStack->pTop = pStack->pBottom;

    //初始化头结点,把头结点的指针域设为NULL
    pStack->pTop->pNext=NULL;
}

/**
    把一个元素压栈
*/
void push_stack(PSTACK pStack,int element){
    //为新结点动态分配一个存储空间
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    if(pNew == NULL){
        printf("内存分配失败,程序结束!");
        exit(-1);
    }

    //把新插入元素的值放入到数据域中
    pNew->data = element;

    //压栈:把新结点挂到头结点后面
    pNew->pNext = pStack->pTop;

    //把栈顶指针指向栈顶元素
    pStack->pTop = pNew;

    return;
}

/**
    遍历栈
*/
void traverse_stack(PSTACK pStack){
    //得到栈顶元素的位置
    PNODE p = pStack->pTop;

    //遍历栈
    while(p != pStack->pBottom){
        printf("%d\t",p->data);
        p = p->pNext;
    }
    printf("\n");

    return;
}

/**
    判断栈是否为空
*/
bool isEmpty(PSTACK pStack){
    if(pStack->pBottom == pStack->pTop)
        return true;
    else
        return false;
}


/**
    出栈,并保存出栈元素
*/
bool pop_stack(PSTACK pStack,int *pElement){
    if(isEmpty(pStack)){
        printf("出栈失败!栈为空!");
        return false;
    }
    //定义一个值保存删除的结点
    PNODE p = pStack->pTop;
    *pElement = p->data;
    pStack->pTop = p->pNext;
    free(p);
    p=NULL;

    return true;

}

/**
    清空栈
*/
void clear_stack(PSTACK pStack){
    if(isEmpty(pStack))
        return;

    PNODE p = pStack->pTop;
    PNODE q = NULL;

    while(p != pStack->pBottom){
        q = p->pNext;
        free(p);
        p=q;
    }
    pStack->pTop = pStack->pBottom;
    return;
}

相关文章

  • python数据结构教程 Day3

    本节重点: 线性结构介绍 栈结构介绍 栈结构ADT实现 栈在问题中的应用 一、线性结构 定义: 线性结构是一种有序...

  • 栈的顺序存储结构

    栈的顺序存储结构 栈是一种重要的线性结构,可以这样讲,栈是线性表的一种具体形式。 栈这种后进先出的数据结构应用是非...

  • 栈和队列

    栈和队列是两种应用非常广泛的数据结构,它们都来自线性表数据结构,都是“操作受限”的线性表。 栈 栈(Stack):...

  • 数据结构与算法掌握这些就够了

    数据结构 线性结构数组、链表、栈、队列 非线性多维数组、树、图 1. 栈 后进先出,可以处理递归调用实际应用:字符...

  • 线性结构的应用-栈

    定义 栈是一种运算受限的线性表 其限制是仅允许在表的一端进行插入和删除运算 允许进行操作的一端被称为栈顶,另一端则...

  • Ⅱ. 栈和队列

    栈和队列都是线性结构,可以用线性表在某种条件下来完成栈和队列的操作 1. 栈 : 先进后出的线性表 应用 : 常见...

  • 大话数据结构 - 链表

    代码GitHub地址 链表概述 数组和链表都是线性存储结构的基础实现,栈和队列都是线性存储结构的应用 数组优缺点 ...

  • 数据结构与算法

    一、线性表及应用 二、线性表的链式存储结构 三、栈与栈的应用 四、哈希表与树 五、二叉树遍历的应用之分治法 六、加...

  • 数据结构-栈的基本操作

    我与数据结构有个约会,带你领略不一样的数据结构! /*问题分析:栈和线性表的关联?栈(包括队列)是线性表的重要应用...

  • 数据结构(一)

    栈:First In Last Out,只能在一端操作的线性结构 PHP每执行函数都会开辟栈,执行完毕释放。应用:...

网友评论

    本文标题:线性结构的应用-栈

    本文链接:https://www.haomeiwen.com/subject/vmubmftx.html