用C语言实现链式栈介绍

目录
  • 堆栈的基本概念
  • 常见的栈有顺序栈和链式栈
  • - 链式栈的C代码实现
  • 代码运行效果

堆栈的基本概念

堆栈是只能在一端增删元素的表结构,该位置称为栈顶堆栈的基本运算是压入和弹出,前者相当于插入,而后者则是删除最后插入的元素,形成后进先出的运算规则最后插入的元素在被弹出之前可以作为栈顶被外界访问从空栈中弹出,或向满栈中压入,都被认为是一种错误

常见的栈有顺序栈和链式栈

顺序栈

链式栈

- 链式栈的C代码实现

#include <stdio.h>
#include <stdlib.h>

/*节点的结构*/
typedef struct node {
    struct node* pnode;
    int data;
}node_t;
/*栈的结构*/
typedef struct stack {
    struct node* top;//栈顶指针
    int size;//栈中数据个数
}stack_t;
/*初始化栈*/
void stack_init(stack_t* stk)
{
    stk->top = NULL;
    stk->size = 0;
}
/*压栈操作*/
void stack_push(stack_t* stk, int data)
{
    node_t *node = malloc(sizeof(node_t));
    node->data = data;
    node->pnode = stk->top;
    stk->top = node;
    stk->size++;
}
/*弹栈:将栈中数据弹入buf*/
void stack_pop(stack_t* stk, int buf[], int size)
{
    for(int i = 0; i < size; ++i) {
        if(stk->size == 0) {
            printf("栈中数据已弹净!\n");
            break;
        }
        node_t* temp = stk->top;
        buf[i] = stk->top->data;
        stk->top = stk->top->pnode;
        stk->size--;
        free(temp);
    }
}
/*删除整个栈*/
void stack_deinit(stack_t* stk)
{
    while(stk->size || stk->top) {
        node_t* temp = stk->top;
        stk->top = stk->top->pnode;
        stk->size--;
        free(temp);
    }
}
/*从栈顶自上而下打印栈中所有数据*/
void print_stack(stack_t* stk)
{
    if(stk->size == 0) {
        printf("栈中无数据!\n");
    }
    for(node_t* node = stk->top;
        node; node = node->pnode) {
        printf("%d ",node->data);
    }
    printf("\n");
}

/*测试代码*/
#define N 30
int main(void)
{
    stack_t stack;
    int buf[N];
    stack_init(&stack);
    printf("开始压栈!\n");
    for(int i = 0; i < N; ++i) {
        stack_push(&stack, i);
    }
    print_stack(&stack);//打印栈中数据
    //stack_deinit(&stack);
    printf("开始弹栈!\n");
    stack_pop(&stack, buf, N);//弹栈
    print_stack(&stack);
    printf("取出的数据为:");
    for(int i = 0; i < sizeof(buf) /
        sizeof(buf[0]); ++i) {
        printf("%d ", buf[i]);
    }
    printf("\n");
    return 0;
}

代码运行效果

到此这篇关于用C语言实现链式栈介绍的文章就介绍到这了,更多相关C语言链式栈内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 用C++实现一个链式栈的实例代码

    自定义一个链式栈,c++语言实现,不足之处,还望指正! 复制代码 代码如下: // MyStack.cpp : 定义控制台应用程序的入口点.//自己构造一个链式栈,具有push(入栈),pop(出栈),top(取得栈顶元素),size(返回栈大小),empty(判断是否为空)等功能#include "stdafx.h"#include <iostream>using namespace std;//构造栈的节点template <class T>struct N

  • C++使用模板类实现链式栈

    本文实例为大家分享了C++使用模板类实现链式栈的具体代码,供大家参考,具体内容如下 一.实现程序: 1.Stack.h #ifndef Stack_h #define Stack_h template <class T> class Stack { public: Stack(){}; // 构造函数 void Push(const T x); // 新元素进栈 bool Pop(); // 栈顶元素出栈 virtual bool getTop(T &x) const = 0; //

  • 用C语言实现链式栈介绍

    目录 堆栈的基本概念 常见的栈有顺序栈和链式栈 - 链式栈的C代码实现 代码运行效果 堆栈的基本概念 堆栈是只能在一端增删元素的表结构,该位置称为栈顶堆栈的基本运算是压入和弹出,前者相当于插入,而后者则是删除最后插入的元素,形成后进先出的运算规则最后插入的元素在被弹出之前可以作为栈顶被外界访问从空栈中弹出,或向满栈中压入,都被认为是一种错误 常见的栈有顺序栈和链式栈 顺序栈 链式栈 - 链式栈的C代码实现 #include <stdio.h> #include <stdlib.h>

  • R语言的历史介绍

    R语言来自S语言,是S语言的一个变种.S语言由Rick Becker, John Chambers等人在贝尔实验室开发, 著名的C语言.Unix系统也是贝尔实验室开发的. S语言第一个版本开发于1976-1980,基于Fortran: 于1980年移植到Unix, 并对外发布源代码. 1984年出版的"棕皮书" (Becker and Chambers 1984) 总结了1984年为止的版本, 并开始发布授权的源代码. 这个版本叫做旧S.与我们现在用的S语言有较大差别. 1989–19

  • Go语言基础知识点介绍

    Go 语言教程 Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本.现在Go的开发已经是完全开放的,并且拥有一个活跃的社区. Go 语言特色 简洁.快速.安全 并行.有趣.开源 内存管理.数组安全.编译迅速 Go 语言用途

  • C# 语言入门基础介绍

    目录 一..NET 体系结构 二.Hello world 三.类型和变量 四.程序结构 前言: C#(读作"See Sharp")是一种新式编程语言,不仅面向对象,还类型安全. 开发人员利用 C# 能够生成在 .NET 中运行的多种安全可靠的应用程序. C# 源于 C 语言系列,C.C++.Java 和 JavaScript 程序员很快就可以上手使用. 本教程概述了 C# 8 及更高版本中该语言的主要组件. C# 是面向对象的.面向组件的编程语言. C# 提供了语言构造来直接支持这些概

  • C语言的预处理介绍

    目录 前言 一.预定义符号 二.#define 1.宏 2.宏与函数 3.带副作用的宏参数 4. 宏和函数的不同 5.#undef 三.条件编译 四.文件包含 总结 前言 编译一个C语言程序涉及很多步骤.其中第一个步骤被称为预处理.C语言的预处理器在源代码编译之前对其进行一些文本性质的操作.它的主要任务包括删除注释.插入被#include指令包含的文件内容.定义和替换由#define指令定义的符号,同时确定代码的部分内容是否应该根据一些条件编译指令进行编译. 一.预定义符号 下表为C语言预处理器

  • C语言数组详细介绍

    目录 什么是数组 一维数组 二维数组 数组越界 数组名 结尾 什么是数组 数组(Array)是一种用来存储同一种类型的集合,是一种有序的线性结构表.并且数组元素的地址是连续的. 数组最大的优点就是支持随机访问,当想访问数组的某个数时,只需要找到数组的对应下标就可以直接找到该数组对应元素.但是数组也有相应的缺点,那就是数组的元素个数和数组空间大小在创建时就已经被固定死了,如果数组的空间没有使用完也会造成空间浪费,并且因为数组的地址是连续的,这本应该是一个优点的,但是这导致数组在进行删除或增加元素时

  • golang语言map全方位介绍

    目录 一.map 1.基本介绍 2.声明基本语法 二.map 的使用 2.map[string]map[string]string使用案例 三.map 的增删改查操作 1.map 增加和更新 2.map 删除 3.map 查找 四.map的其他操作 1.map 遍历: 2.map 的长度 3.map 切片 4.map 排序 五.map 使用细节 总结 一.map 1.基本介绍 map 是 key-value 数据结构,又称为字段或者关联数组.类似其它编程语言的集合, 在编程中是经常使用到 2.声

  • C语言循环控制入门介绍

    目录 循环控制: for 循环 while 循环 do while 循环 switch case break: continue: break continue 区别: 总结 循环控制: for 循环 for (语句1; 表达式; 语句2) { 语句块 } 1)循环开始时,先执行语句1. 2)接着判断表达式的条件,如果条件成立,就执行一次循环体中的语句块. 3)语句块执行完后,接下来会执行语句2. 4)重复第2)步和第3),直到表达式的条件不成立才结束for循环. 常见形式: for (int

  • C语言 超详细介绍与实现线性表中的带头双向循环链表

    目录 一.本章重点 二.带头双向循环链表介绍 2.1什么是带头双向循环链表? 2.2最常用的两种链表结构 三.带头双向循环链表常用接口实现  3.1结构体创建 3.2带头双向循环链表的初始化  3.3创建新节点 3.4尾插 3.5打印链表 3.6头插 3.7尾删 3.8头删 3.9查找data(返回data的节点地址) 3.10在pos位置之前插入节点 3.11删除pos位置的节点 四.实现接口总结 五.在线oj训练与详解 一.本章重点 带头双向循环链表介绍 带头双向循环链表常用接口实现 实现接

  • C语言 超详细介绍与实现线性表中的无头单向非循环链表

    目录 一.本章重点 二.链表介绍 三.无头单向非循环链表常用接口实现 3.1动态申请一个节点 3.2单链表打印 3.3单链表尾插 3.4单链表的头插 3.5单链表的尾删 3.6单链表头删 3.7单链表查找 3.8单链表在pos位置之前插入x 3.9单链表删除pos位置的节点 四.在线oj训练 4.1移除链表元素(力扣) 4.2反转单链表(力扣) 一.本章重点 无头单向非循环链表介绍 无头单向非循环链表常用接口实现 在线oj训练 二.链表介绍 概念:链表是一种物理存储结构上非连续.非顺序的存储结构

随机推荐