美文网首页
栈(C实现)

栈(C实现)

作者: 大成小栈 | 来源:发表于2021-04-28 00:12 被阅读0次

1. 顺序栈

顺序栈的数据结构就是将一个数组的一端作为栈底,另一端为栈顶:

  1. 定义栈的数组;
  2. 设置栈的容量;
  3. 设置top标记。

压栈:

//元素elem进栈,a为数组,top值为当前栈的栈顶位置
int push(int* a,int top,int elem){
    a[++top]=elem;
    return top;
}

出栈:

//数据元素出栈
int pop(int * a,int top){
    if (top==-1) {
        printf("空栈");
        return -1;
    }
    printf("弹栈元素:%d\n",a[top]);
    top--;
    return top;
}

整体调用:

#include <stdio.h>
//元素elem进栈
int push(int* a,int top,int elem){
    a[++top]=elem;
    return top;
}
//数据元素出栈
int pop(int * a,int top){
    if (top==-1) {
        printf("空栈");
        return -1;
    }
    printf("弹栈元素:%d\n",a[top]);
    top--;
    return top;
}
int main() {
    int a[100];
    int top=-1;
    top=push(a, top, 1);
    top=push(a, top, 2);
    top=push(a, top, 3);
    top=push(a, top, 4);
    top=pop(a, top);
    top=pop(a, top);
    top=pop(a, top);
    top=pop(a, top);
    top=pop(a, top);
    return 0;
}

// 输出
弹栈元素:4
弹栈元素:3
弹栈元素:2
弹栈元素:1
空栈

2. 链栈

链栈就是将链表的头部作为栈顶,尾部作为栈底:

链表中结点结构

typedef struct lineStack{
    int data;
    struct lineStack * next;
}lineStack;

压栈:

//stack为当前的链栈,a表示入栈元素
lineStack* push(lineStack * stack,int a){
    //创建存储新元素的节点
    lineStack * line=(lineStack*)malloc(sizeof(lineStack));
    line->data=a;
    //新节点与头节点建立逻辑关系
    line->next=stack;
    //更新头指针的指向
    stack=line;
    return stack;
}

出栈:

//栈顶元素出链栈的实现函数
lineStack * pop(lineStack * stack){
    if (stack) {
        //声明一个新指针指向栈顶节点
        lineStack * p=stack;
        //更新头指针
        stack=stack->next;
        printf("出栈元素:%d ",p->data);
        if (stack) {
            printf("新栈顶元素:%d\n",stack->data);
        }else{
            printf("栈已空\n");
        }
        free(p);
    }else{
        printf("栈内没有元素");
        return stack;
    }
    return stack;
}

整体调用:

#include <stdio.h>
#include <stdlib.h>
typedef struct lineStack{
    int data;
    struct lineStack * next;
}lineStack;
lineStack* push(lineStack * stack,int a){
    lineStack * line=(lineStack*)malloc(sizeof(lineStack));
    line->data=a;
    line->next=stack;
    stack=line;
    return stack;
}
lineStack * pop(lineStack * stack){
    if (stack) {
        lineStack * p=stack;
        stack=stack->next;
        printf("弹栈元素:%d ",p->data);
        if (stack) {
            printf("栈顶元素:%d\n",stack->data);
        }else{
            printf("栈已空\n");
        }
        free(p);
    }else{
        printf("栈内没有元素");
        return stack;
    }
    return stack;
}
int main() {
    lineStack * stack=NULL;
    stack=push(stack, 1);
    stack=push(stack, 2);
    stack=push(stack, 3);
    stack=push(stack, 4);
    stack=pop(stack);
    stack=pop(stack);
    stack=pop(stack);
    stack=pop(stack);
    stack=pop(stack);
    return 0;
}

// 输出
弹栈元素:4 栈顶元素:3
弹栈元素:3 栈顶元素:2
弹栈元素:2 栈顶元素:1
弹栈元素:1 栈已空
栈内没有元素

相关文章

  • 3. 栈的操作

    1. 栈的操作-c语言实现2. 栈操作的实现-顺序栈和链栈 3. 栈的实现与遍历4. c语言的函数调用栈5. 两个...

  • C++语言实现顺序栈

    C++语言实现顺序栈 在写C语言实现顺序栈的时候,我已经向大家介绍了>栈的特点以及介绍了栈的相关操作,并利用C语言...

  • 栈(C实现)

    1. 顺序栈 顺序栈的数据结构就是将一个数组的一端作为栈底,另一端为栈顶: 定义栈的数组; 设置栈的容量; 设置t...

  • 动态栈的存储结构及算法C语言实现

    动态栈的存储结构及算法C语言实现

  • C 链表实现栈

    前言 第一次学数据结构,代码写的可能不是很好,大神勿喷,指出来就行。 读本文之前建议先学下链表 C 实现链表 (如...

  • C栈|伟伟日日精进:我在C栈的蜕变之旅-20201223

    C栈是一个可以让你实现从依赖到独立到互赖的一个不断充电的平台。—C栈 问题就是转机,危机就是机遇—C栈 高效能人士...

  • 2019-01-14

    Lua与C交互学习笔记 Lua与C交互是通过虚拟栈实现的 在C中调用Lua 方法一 栈中的情况如下表所示 方法二 ...

  • 数据结构:栈与队列

    本文内容:一、栈1、什么是栈?2、栈的操作集.3、栈的 C 实现.二、队列1、什么是队列?2、队列的操作集.3、队...

  • iOS NavigationController栈跳转

    3种跳转方式 a->b->c-> 实现c->a 1.通过修改导航栈来跳转 先修改栈再pop 2.通过popT...

  • 2019-07-02 C#实现栈

    先用C#实现一个栈的类,如下: 上面要注意的是入栈时,是直接把值赋给栈顶,然后再将栈顶加1,出栈的时候,先将栈顶减...

网友评论

      本文标题:栈(C实现)

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