栈(stack) C语言实现 详解

栈(stack) C语言实现 详解栈是数据结构中较为简单的结构体 是一种操作收到限制的线性表 但简单不代表没用 毕竟数组还贼简单呢 谁敢说数组没用 栈栈的理论栈是一个先进后出的结构 类似于堆盘子 先放到地上的盘子最后被取走 默认只能取走一个盘子 栈其实就是操作受限的线性表 只有一个口 每一次操作时 这个口可以当出口也可以当入口 例如 水桶 注入水时 水桶的头当做入口 倒水时 水桶的头当做出口栈的图解 在图解之前 先举一个例

栈的理论

  • 栈是一个先进后出的结构,类似于堆盘子,先放到地上的盘子最后被取走(默认只能取走一个盘子)
  • 栈其实就是操作受限的线性表,只有一个口,每一次操作时,这个口可以当出口也可以当入口.
  • 例如:水桶,注入水时,水桶的头当做入口,倒水时,水桶的头当做出口

栈的图解.

在图解之前,先举一个例子,让大家记住栈 : 栈其实就是吃了一顿饭,然后吐出来.

  • 这是一个空栈,只有上面是入口和出口
    在这里插入图片描述

  • 放入一个元素a

在这里插入图片描述

  • 接着依次放入B,C元素

在这里插入图片描述

  • 取出一个元素,由栈只有一个口的特点可以知道取出了C

在这里插入图片描述

  • 再次放入一个元素D

在这里插入图片描述

栈的可用操作

根据理论环节,可以轻易的看出:栈的基本操作只有两个:

  • 入栈
  • 出栈

而且样子长得十分像一个水桶。

  • 入栈(英文名:push)
  • 判(栈)满(isFull)
  • 出栈(pop)
  • 判(栈)空(isEmpty)

栈的C语言定义(结构体)

两种栈各有好处,争论是愚蠢的,学习是学不完的,所以赶快开始coding吧

数组栈

typedef struct { 
    int Data[MaxSize]; // 存储元素的数组 int topIdx; //栈顶指针 }SeqStack; 

栈的四个基本操作定义:

//return 0 为false,1为true(下同) // 将元素推入栈中 int Push(SeqStack &L, int e) { 
    // 栈已满 if(L.topIdx==MaxSize -1) { 
    return 0; } // 加入栈中 L.Data[L.topIdx++] = e; // 返回自身 return e; } // 移除栈顶元素 int Pop(SeqStack &L) { 
    // 栈空 if(L.topIdx == 0) { 
    //返回失败 return 0; } // 打印并返回栈 int val = L.Data[--L.topIdx]; printf("%d ",val); return val; } //判断栈s是否为空 int isEmpty(SeqStack s) { 
    // 如果下标在0,说明栈中无元素 if(s.topIdx != 0) { 
    return 1; } return 0; } // 判断栈是否已栈. Status isFull(SeqStack s) { 
    // 已满返回true(1) if(s.topIdx != MaxSize -1)//之前的定义数组的最大值的下标 { 
    return 1; } return 0; } 

链表栈

结构体

typedef struct LNode { 
    ElemType data; struct LNode * next; } LNode,*LinkList; 

两大功能(链表无需判满,判空也简单,不再单独实现)

Status Pop(LinkList L) { 
    if(L->next == NULL) { 
    return 0; } LinkList tem = L->next; printf("%d ",tem->data); L->next = tem->next; free(tem); return 1; } Status Push(LinkList L, ElemType e) { 
    LinkList newNode = (LinkList) malloc(sizeof(LinkList)); newNode->data = e; newNode->next = L->next; L->next = newNode; return 1; } 

最后写几个简单的作业(我们老师留给我们的)以及我的代码

//1、本题要求实现顺序栈,写出Push 、Pop、StackEmpty函数的实现,并用一个简单的main函数测试。 //已有类型定义 typedef struct { 
    ElementType Data[MaxSize]; // 存储元素的数组 Position Top; //栈顶指针 }SeqStack; //函数接口定义: Status Push(SeqStack &L, ElemType e); Status Pop(SeqStack &L, ElemType &e); Status StackEmpty(SeqStack s); //判断栈s是否为空 //其中 L 和 e 都是用户传入的参数。 L 是带头结点的头指针; e 是数据元素。 / * 3、进制转换。 * 输入一个十进制正整数n和一个目标进制R(1 
    
   

我的代码实现:

#include  
     #include  
     #define MaxSize 100 typedef int Status; typedef int ElemType; typedef int Position; //1、本题要求实现顺序栈,写出Push 、Pop、StackEmpty函数的实现,并用一个简单的main函数测试。 //已有类型定义 typedef struct { 
    ElemType Data[MaxSize]; // 存储元素的数组 Position Top; //栈顶指针 } SeqStack; //函数接口定义: Status Push(SeqStack &L,ElemType e); Status Pop(SeqStack &L); Status StackEmpty(SeqStack s); //判断栈s是否为空 Status prinStack(SeqStack &L); Status convNum(int n, int R); Status pipei(); void work1(); //其中 L 和 e 都是用户传入的参数。 L 是带头结点的头指针; e 是数据元素。 int main() { 
    //work1();//第一题 //convNum(8,2);//进制转化 pipei(); return 0; } Status prinStack(SeqStack &L) { 
    while (StackEmpty(L)) { 
    Push(L); } return 1; } void work1() { 
    SeqStack L; L.Top = 0; Pop(L, 1); Pop(L, 2); Pop(L, 3); prinStack(L); } Status Pop(SeqStack &L) { 
    if(L.Top == 0) { 
    return 0; } printf("%d ",L.Data[--L.Top]); return 1; } Status Push(SeqStack &L, ElemType e) { 
    if(L.Top==MaxSize -1) { 
    return 0; } L.Data[L.Top++] = e; return 1; } //判断栈s是否为空 Status StackEmpty(SeqStack s) { 
    if(s.Top != 0) { 
    return 1; } return 0; } //3、进制转换。 //输入一个十进制正整数n和一个目标进制R(1 
   
     Status 
    convNum 
    ( 
    int n 
    , 
    int R 
    ) 
    { 
      
    //声明栈 SeqStack L 
    ; L 
    .Top 
    = 
    0 
    ; 
    while 
    (n 
    != 
    0 
    ) 
    { 
      
    //将每次产生的余数防入栈低 
    Pop 
    (L 
    , n 
    %R 
    ) 
    ; n 
    /=R 
    ; 
    } 
    prinStack 
    (L 
    ) 
    ; 
    return 
    1 
    ; 
    } 
   

以下附上Java 代码实现的栈

public class LinkedStack<T> { 
    private Node topNode; public T push(T newEntry) { 
    Node newNode = new Node<T>(newEntry, topNode); topNode = newNode; T tempData = peek(); return tempData; } public T pop() { 
    T tempData = peek(); if (tempData == null) { 
    return null; } topNode = topNode.next; return tempData; } public T peek() { 
    if (isEmpty()) { 
    return null; } return (T) topNode.data; } public boolean isEmpty() { 
    return topNode == null; } public void clear() { 
    topNode = null; // java拥有内存回收,只需要让头结点引用为空即可,GC就可以回收掉所有其他节点。 } public LinkedStack() { 
    this.topNode = null; } private class Node<T> { 
    private T data; private Node next; public Node(T dataPortion) { 
    this(dataPortion, null); } public Node(T data, Node next) { 
    super(); this.data = data; this.next = next; } public T getData() { 
    return data; } public void setData(T data) { 
    this.data = data; } public Node getNext() { 
    return next; } public void setNext(Node next) { 
    this.next = next; } } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225115.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午10:04
下一篇 2026年3月17日 上午10:05


相关推荐

  • 《可复制的领导力》思维导图读书笔记,提升职场竞争力[通俗易懂]

    《可复制的领导力》思维导图读书笔记,提升职场竞争力[通俗易懂]身在职场中的我们,很多人都为缺乏领导力而头痛,羡慕那些成功领导者所具备的领导力。但几乎所有人都认为领导力是一种感觉,是一门很深奥的学问,是经过许多年去锻炼出来的,是学不会的。王侯将相,宁有种乎?小编现在想告诉大家,其实领导力的方法与技巧,每个人都可以通过学习来掌握,不论是看书也好,看视频也罢。都是可以的。即便你不是领导,也同样需要领导力,因为这可以在社会彰显你的价值。下面通过MindMaster思维导图走进樊登老师的著作里,去学习和掌握领导力的一些方法与技巧。(注:本图由MindMaster导图

    2022年6月17日
    37
  • matlab 画圆

    matlab 画圆一、绘制圆点plot(1,2,’ro’)二、绘制圆形1、空心圆:11、plot>>aplha=0:pi/40:2*pi;>>r=2;>>x=r*cos(aplha);>>y=r*sin(aplha);>>plot(x,y,’-‘);>>axisequal22、rectanglerectangle(‘position’,[0-3,0

    2022年6月19日
    75
  • js页面刷新事件 ,Javascript刷新页面的几种方法

    js页面刷新事件 ,Javascript刷新页面的几种方法1 10 表示间隔 10 秒刷新一次 2 window location reload true 如果是你要刷新某一个 iframe 就把 window 给换成 frame 的名字或 ID 号 3 window navigate 本页面 url 4functionabc window location href blog window location href

    2026年3月19日
    0
  • 拖库 洗库 撞库_地库拖车

    拖库 洗库 撞库_地库拖车间接转载地址:http://blog.csdn.net/daliaojie/article/details/42171177一,背景:用户数据泄露一直是如今互联网世界的一个焦点,从最近的京东撞库抹黑事件,到之前的CSDN,如家用户数据的泄露,服务商和黑客之间在用户数据这个舞台上一直在进行着旷日持久的攻防战。对于大多数用户而言,撞库可能是一个很专业的名词,但是理

    2025年7月13日
    5
  • Sybase PowerDesigner 12通用的破解方法

    Sybase PowerDesigner 12通用的破解方法

    2021年5月8日
    224
  • hough变换检测直线原理(opencv霍夫直线检测)

    直线的霍夫变换:霍夫空间极坐标与图像空间的转换公式:p=y*sin(theta)+x*cos(theta);之后遍历图像的每个坐标点,每个坐标点以一度为增量,求取对应的p值,存入数组中,查找数组中数目大于一定阈值的p和theta,再在图像空间中把直线恢复出来霍夫变换就是把图像左边空间上的线段转换到霍夫空间一个点,然后通过点的数目多少来确定是否为一条线段(但是画出的结果为一条

    2022年4月16日
    98

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号