C语言堆栈-解释与代码示例(转)

转自:C语言中堆栈是什么意思,如何实现?-群英

C语言中堆栈是什么意思,如何实现?

这篇文章给大家分享的是C语言中堆栈的相关内容,一些新手可能对于什么是堆栈不是很了解,对此本文有很详细的介绍,对大家学习和理解C语言中堆栈会有一定的帮助,那么接下来感兴趣的朋友就跟随小编一起学习一下吧。

一、何为堆栈?
    a.堆栈是一种特殊的线性表

    b.堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其不同点是:线性表允许在任意位置插入和删除数据元素,但堆栈只允许在固定一端进行插入和删除数据元素,所以栈又称为“先进后出”(FILO)或“后进先出”(LIFO)的线性表

    c.堆栈中允许进行插入和删除数据元素的一端称为栈顶,另一端称为栈底

    d.堆栈的插入操作通常称为进栈或入栈;堆栈的删除操作通常称为出栈或退栈

二、思维导图


三、代码
    1、顺序堆栈
#include <stdio.h>
typedef int DataType;
#define MaxStackSize 64
typedef struct
{
    DataType stack[MaxStackSize];
    int top;
}SeqStack;
//初始化
void StackInit(SeqStack *S)
{
    S->top = 0;
}
//判断是否栈空
int StackIsEmpty(SeqStack S)
{
    if (S.top <= 0)
        return 0;
    else
        return 1;
}
//入栈
int StackPush(SeqStack *S, DataType x)
{
    if (S->top >= MaxStackSize)
    {
        printf("栈满,无法进栈!!!\n");
        return 0;
    }
    else
    {
        S->stack[S->top] = x;
        S->top++;
        return 1;
    }
}
//出栈
int StackPop(SeqStack *S, DataType *x)
{
    if (S->top <= 0)
    {
        printf("堆栈已空,无法出栈!!!\n");
        return 0;
    }
    else
    {
        S->top--;
        *x = S->stack[S->top];
        return 1;
    }
}
//获取栈顶元素
int StackGetTop(SeqStack S, DataType *x)
{
    if (S.top <= 0)
    {
        printf("堆栈已空!!!\n");
            return 0;
    }
    else
    {
        *x = S.stack[S.top - 1];
        return 1;
    }
}
int main()
{
    SeqStack myStack;
    int i, x;
    StackInit(&myStack);
    for (i = 0; i < 10; i++)
        StackPush(&myStack, i + 1);
    StackGetTop(myStack, &x);
    printf("当前栈顶元素为:%d\n", x);
    printf("依次出栈:");
    while (StackIsEmpty(myStack))
    {
        StackPop(&myStack, &x);
        printf("%d ", x);
    }
    system("pause");
    return 0;
}

    2、链式堆栈
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct snode
{
    DataType data;
    struct snode *next;
}LSNode;
//初始化
void StackInit(LSNode **top)
{
    *top = (LSNode *)malloc(sizeof(LSNode));
    (*top)->next = NULL;
}
//判断堆栈是否非空
int StackIsEmpty(LSNode *top)
{
    if (top->next == NULL)
        return 0;
    else
        return 1;
}
//入栈
void StackPush(LSNode *top, DataType x)
{
    LSNode *p;
    p = (LSNode *)malloc(sizeof(LSNode));
    p->data = x;
    p->next = top->next;
    top->next = p;
}
//出栈
int StackPop(LSNode *top, DataType *x)
{
    LSNode *p = top->next;
    if (p == NULL)
    {
        printf("堆栈已空,删除错误!!!\n");
        return 0;
    }
    top->next = p->next;
    *x = p->data;
    free(p);
    return 1;
}
//获取栈顶元素
int StackGetTop(LSNode *top, DataType *x)
{
    LSNode *p = top->next;
    if (p == NULL)
    {
        printf("堆栈已空,取出错误!!!\n");
        return 0;
    }
    *x = p->data;
    return 1;
}
//释放内存空间
void StackDestroy(LSNode **top)
{
    LSNode *p, *q;
    p = *top;
    while (p != NULL)
    {
        q = p;
        p = p->next;
        free(q);
    }
    *top = NULL;
}
int main()
{
    int i, x;
    LSNode *top;
    StackInit(&top);
    for (i = 0; i < 10; i++)
        StackPush(top, i + 1);
    StackGetTop(top, &x);
    printf("当前栈顶元素为%d\n", x);
    printf("依次出栈:");
    while (StackIsEmpty(top))
    {
        StackPop(top, &x);
        printf("%4d", x);
    }
    StackDestroy(&top);
    system("pause");
    return 0;
}

总结
    关于C语言中堆栈的内容就介绍到这,上述示例具有一定的借鉴价值,感兴趣的朋友可以参考,希望能对大家有帮助,想要了解更多堆栈的内容,大家可以关注其它的相关文章。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值