单链表实现栈

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

typedef char stack_element_t;

typedef struct stack_node_s
{
    stack_element_t element;
    struct stack_node_s *restp;
}stack_node_t;

/*Stack top pointer*/
typedef struct
{
    stack_node_t *topp;
}stack_t;

void push(stack_t *sp, stack_element_t c)
{
    stack_node_t *newp;

    /*Creates and defines new node*/
    newp = (stack_node_t*)malloc(sizeof(stack_node_t));
    newp->element = c;
    newp->restp = sp->topp;

    /*Renew stack top pointer*/
    sp->topp = newp;
}

stack_element_t pop(stack_t *sp)
{
    stack_node_t *to_freep;
    stack_element_t ans;

    to_freep = sp->topp;
    ans = to_freep->element;
    sp->topp = to_freep->restp;
    free(to_freep);

    return ans;
}

int main(void)
{
    stack_t s = {0};

    push(&s, ‘2‘);
    push(&s, ‘+‘);
    push(&s, ‘C‘);
    push(&s, ‘/‘);

    printf("\nEmptying stack: \n");
    while(s.topp != NULL)
        printf("%c\n", pop(&s));

    return 0;
}
时间: 2024-10-27 16:37:09

单链表实现栈的相关文章

单链表与栈

(一) 栈,后进先出,只允许访问一个数据项:即最后插入的数据项.栈操作: push入栈:第一步指针上移一个单位,第二步将数据插入到这个存储单元: pop出栈:第一步移除指针指向的数据项,第二步指针下移一个单位,指向新的栈顶元素: peek查看:不操作元素,只是查看栈顶元素的值: 结果: 上面的实现是用数组实现的,有个最大缺点是一旦数组创建,大小不可变.下面介绍另一种存储结构-链表. 首先,在链表中,每个数据项都包含在"链结点"中,这个链结点包括存储的数据本身和一个对下一个链结点引用的字

日常学习随笔-数组、单链表、双链表三种形式实现栈结构的基本操作

一.栈结构 栈(stack)是限制插入和删除只能在一个位置上的表,该位置是 表的末端,叫做栈的顶(Top).对栈的基本操作有push(进栈),pop(出栈),peak(栈顶元素),size(栈容量)等. 栈的核心思想:"先进后出". 二.案例一:数组实现"栈" 1 package com.xfwl.algorithmAnalysis.stack; 2 3 import java.util.Arrays; 4 5 /** 6 * 自定义栈结构(基于数组的形式) 7 *

栈的简单实现(2)-单链表实现

引言 栈(stack)是一种被广泛使用的线性数据结构,它只允许在表的一端进行插入或删除操作,因而栈也可以被称作为操作受限的线性表 .在栈中,允许插入或删除的一端称作栈顶(top)不允许插入和删除的另一端称作栈底(bottom); 示意图如下: 此文借助单链表简单地实现栈及其基本操作. 代码如下: typedef struct stack{ int data; struct stack* next; }ListStack; 注:这里假设栈中储存的是整型 (int) 的数据 基本操作 1.栈的初始化

栈,队列,单链表,双向链表

1. 定义头文件 实现栈方法的定义,注意这里用到了全局的静态数组,可以通过这种方式保护数据. main.c,实现存储 队列,创建头文件queue.h 创建queue.c 实现main函数 单链表 在定义头文件的时候,最好使用: #ifndef 变量A #define变量A 函数声明和结构声明等声明 #endif 通过上面的这种方式可以避免重复调用头文件时候产生的负面影响. 定义头文件link.h:(注意加上extern) 定义link.c 编写main.c 4.双向链表 创建link.h头文件

栈、队列、单链表

栈: <span style="color:#000000;">#define MAX_SIZE 100//队列的最大长度 //-------------------------栈----------------------- int top=0;//栈顶变量 void add(char st[],char intput){ //入栈函数 st[top]=intput; top++; } void pop(char st[]){ //出栈函数 top--; st[top]=

python中栈的单链表实现

参考博客:https://www.cnblogs.com/stacklike/p/8284550.html 基于列表的简单实现 # 先进后出 # 以列表实现的简单栈 class SimpleStack: # 特殊属性,用以限制class可添加的属性 __slots__ = ('__items',) def __init__(self): self.__items = [] def is_empty(self): return self.__items == [] def peek(self):

栈和队列----将单链表的每K个节点之间逆序

将单链表的每K个节点之间逆序 给定一个单链表的头节点head,实现一个调整链表的函数,使得每K 个节点之间逆序,如果最后剩下不够K 个节点,则不调整最后几个. 例如: 链表:1->2->3->4->5->6->7->8->null,k=3. 调整好后:3->2->1->6->5->4->7->8->null,其中7.8不调整,因为不够一组. [解析] 1. 首先从左到右遍历链表,如果栈的大小不等于k ,则不断的

C++实现单链表和子类栈(Stack)及单向队列(Queue)

刚刚开始学习c++.之前c的内容掌握的也不多,基本只是一本概论课的程度,以前使用c的struct写过的链表.用python写过简单的数据结构,就试着把两者用c++写出来,也是对c++的class,以及继承中的public/protected/private的性质进行初步了解.第一次写头文件.h和源文件.cpp分开的c++代码.过程中参考了ProLyn和kgvito的代码,基本就是百度"单链表 c++"的前几个搜索结果. 节点listNode还是用struct来写了,因为我想节点除了构造

数据结构 线性结构(数组[列表] ,链表 单链表的增删改查**, 线性结构的应用 队列 栈[函数的调用**]),非线性结构 树

数据结构 参考:http://lupython.gitee.io/ 线性结构 就是能够用一根线串起来的数据结构 数组 (列表) 问:申请数组的前提条件是啥? a[12]?内存需要满足的条件? 答:内存必须有一块连续的内存空间 int a[7] : 声明一个数组,这个数组的数组名是 a, 数组的大小是 7, 数组元素的类型是整型. int a[7] = array(1,2,3,4,5,6,7) 问:如何申请内存? 答:C,C++语言,申请:mallco (28).释放:free(28) 问:int