数据结构之栈

Posted ljd4you

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构之栈相关的知识,希望对你有一定的参考价值。

一、栈

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。--百度百科

(类似于子弹夹,先压入的子弹最后才被发射出去,最后压入的子弹最先发射出去)

二、代码实现

技术分享图片
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
//基于链表的动态栈 
typedef struct node{
    int data;
    struct node * pNext;
}NODE,* PNODE;
//设置指向栈顶的指针pTop,以及指向栈底(最下面的一个有效节点的下一个节点)的 指针pBottom 
typedef struct stack{
    PNODE pTop;
    PNODE pBottom;
}STACK,* PSTACK;

//函数声明
void init(PSTACK pS);
void push(PSTACK pS,int val);
bool pop(PSTACK pS,int * pVal);
void clear(PSTACK pS);
void traverse(PSTACK pS);
bool empty(PSTACK pS);
 

int main(void)
{
    STACK s;
    PSTACK pS = &s;
    
    int val;
    int * pVal = &val;
    
    init(pS);
    push(pS,1);
    push(pS,2);
    push(pS,3);
    push(pS,4);
    traverse(pS);
    
    if(pop(pS,pVal))
    {
        printf("出栈成功,出栈元素为:%d
",*pVal);
    }else{
        printf("出栈失败!!
");
    }
         
    traverse(pS);
    
    clear(pS);
    traverse(pS);
    return 0;
}
//***************init()初始化栈****************************
void init(PSTACK pS)
{
    pS->pTop = (PNODE)malloc(sizeof(NODE));
    if(pS->pTop==NULL)
    {
        printf("动态内存分配失败!
");
        exit(-1);
    }else{
        pS->pBottom = pS->pTop;
        pS->pTop->pNext = NULL;
    }
    
}
//***************push()压栈*****************************
void push(PSTACK pS,int val)
{
    PNODE pNew = (PNODE)malloc(sizeof(NODE));
    if(pNew==NULL)
    {
        printf("动态内存分配失败!
");
        exit(-1);
    }else{
        pNew->data = val;
        pNew->pNext = pS->pTop;
        pS->pTop = pNew;
    }
}
//***************traverse()遍历栈内元素****************************
void traverse(PSTACK pS)
{
    PNODE p = pS->pTop;
    while(p!=pS->pBottom)
    {
        printf("%d  ",p->data);
        p = p->pNext;
    }
    printf("
");
}
bool pop(PSTACK pS,int * pVal)
{
    if(empty(pS))
    {
        return false;
    }else{
        PNODE q = pS->pTop;
        *pVal = q->data;
        pS->pTop = q->pNext;
        free(q);
        q = NULL;
    }
}
//***************empty()判断栈是否为空**************************** 
bool empty(PSTACK pS)
{
    if(pS->pTop==pS->pBottom)
        return true;
    else
        return false;
}
//***************clear()清空栈内元素,栈为空栈**************************** 
void clear(PSTACK pS)
{
    if(empty(pS))
    {
        printf("栈为空。。。
");
        return;
    }else{
        PNODE r1 = pS->pTop;
        PNODE r2 = NULL;
        while(r1!=pS->pBottom)
        {
            r2 = r1->pNext;
            free(r1);
            r1 = r2;        
        }
        pS->pTop = pS->pBottom;
        printf("栈已被清空!!
");
    }
}
View Code

三、运行结果

技术分享图片

以上是关于数据结构之栈的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之栈

数据结构之栈

数据结构之栈

数据结构之栈

python数据结构之栈

数据结构之栈