C语言---堆栈(链表实现)

一:堆栈的引入

堆栈可以比较好的解决后缀表达式的问题。

拓展一:

中缀表达式:运算符号位于两个运算数之间;例如a + b * c - d/c;

后缀表达式:运算符号位于两个运算数之后;例如ab * + de -;

这个时候就需要一种存储办法,能够顺序存储运算数,并在需要的时候倒序输出,这就需要堆栈。

二、堆栈的概念

堆栈是一个特定的存储区或寄存器,它的一端是固定的,另一端是浮动的 。对这个存储区存入的数据,是一种特殊的数据结构。所有的数据存入或取出,只能在浮动的一端(称栈顶)进行,严格按照“先进后出”的原则存取,位于其中间的元素,必须在其栈上部(后进栈者)诸元素逐个移出后才能取出。

堆栈的存储过程像一个堆碟子的过程,旧的碟子堆在下面,新碟子堆在上面,拿碟子的过程,也是先拿新碟子,最后才能拿到旧碟子。

三、堆栈的链表实现

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

typedef int Elementtype;

//定义节点
typedef struct Node{
    Elementtype Element;
    struct Node *next;
}NODE,*PNODE;

//定义栈的结构体
typedef struct Stack{
    PNODE PTOP;
    PNODE PBOOTOM;
}STACK,* PSTACK;

void InitStack(PSTACK Stack);
void PushStack(PSTACK Stack,int val);
void PopStack(PSTACK Stack,int *val);
void TraverseStack(PSTACK Stack);
bool IsEmpty(PSTACK Stack);
void ClearStack(PSTACK Stack);

int main(){
    STACK Stack;
    int val = 0;
    InitStack(&Stack);
    IsEmpty(&Stack);
    PushStack(&Stack,100);
    PushStack(&Stack,100);
    PushStack(&Stack,100);
    PushStack(&Stack,100);
    IsEmpty(&Stack);
    PopStack(&Stack,&val);
    TraverseStack(&Stack);
    ClearStack(&Stack);

    return 0;
} 

void InitStack(PSTACK Stack){
    PNODE PNew = (PNODE)malloc(sizeof(NODE));
    if(PNew == NULL){
        printf("新结点空间的分配失败!");
        exit(-1);
    }

    Stack->PTOP = PNew;
    Stack->PBOOTOM = PNew;
    PNew->next = NULL;
    printf("栈创建成功!\n");
}

void PushStack(PSTACK Stack,int val){
    PNODE P = (PNODE)malloc(sizeof(NODE));
    if(P == NULL){
        printf("新结点空间的分配失败!");
        exit(-1);
    }
    P->Element=val;    //将值赋给结点的赋值域
    P->next = Stack->PTOP;    //使新建的结点指向上一个结点
    Stack->PTOP = P;    //更新栈顶元素,使其指向新的结点
}

void PopStack(PSTACK Stack,int *val){
    if(Stack->PBOOTOM == Stack->PTOP){
        printf("栈已空");
    }
    PNODE P = Stack->PTOP;
    *val = P->Element;
    Stack->PTOP = P->next;
    free(P);
    P = NULL;
    printf("%d 已出栈!\n",*val);
} 

void TraverseStack(PSTACK Stack){
    if (IsEmpty(Stack)){
        printf("遍历栈失败,栈已空!\n");
    }
    PNODE P = Stack->PTOP;
    printf("遍历栈中的元素为:");
    while(P != Stack->PBOOTOM){
        printf("%d\n",P->Element);
        P = P->next;
    }
}

bool IsEmpty(PSTACK Stack){
    if(Stack->PTOP == Stack->PBOOTOM){
        printf("栈为空!\n");
        return true;
    }
    else{
        return false;
    }
}

void ClearStack(PSTACK Stack){
    if(IsEmpty(Stack)){
        printf("栈为空,无需再清除!\n");
    }
    PNODE P = Stack->PTOP;
    PNODE S = NULL;

    while(P != Stack->PBOOTOM){
        S = P->next;
        free(P);
        P = S;
    }
    Stack->PTOP = Stack->PBOOTOM;
    printf("栈已清空!\n");
}

运行结果图

原文地址:https://www.cnblogs.com/changfan/p/11695212.html

时间: 2024-10-29 04:57:21

C语言---堆栈(链表实现)的相关文章

C++语言堆栈的详细讲解

本文主要向大家介绍了C++语言堆栈的详细讲解,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助. 一.预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵. 3.全局区(静态区)(stati

C语言实现链表节点的插入

对链表进行增删改查是最基本的操作.我在上一篇博客<C语言实现链表节点的删除>实现了删除链表中的某个节点.这里我们要来实现在某个位置插入节点.示例代码上传至https://github.com/chenyufeng1991/InsertList  . 核心代码如下: Node *InsertToPosition(Node *pNode,int pos,int x){ if (pos < 0 || pos > sizeList(pNode) ) { printf("%s函数执

堆栈链表储存

//堆栈,链表实现#include<iostream>using namespace std;class stack{public: int data; stack*next; };stack*Linkstack(){ stack*s = new stack; s->next = NULL; //生成一个头结点,但不表示任何数 return s;}int pop(stack*head); //出栈void push(stack*head,int x);//进栈int main(){ st

下压堆栈(链表实现)

import java.util.Iterator; import java.util.Scanner; public class Stack<Item> implements Iterable<Item> { private Node first;// 栈顶 private int N;// 元素数量 // 定义结点的嵌套类 private class Node{ Item item; Node next; } public boolean isEmpty() { return

C 语言静态链表实现

C  语言静态链表实现 可运行源代码 staticlink.h #include <stdio.h> #include <stdlib.h> #define OK 1 #define TRUE 1 #define FALSE 0 #define ERROR 0 #define MAX_SIZE 100 typedef int Status; typedef int ElementType; typedef struct StaticLinkList { ElementType da

C语言实现链表的逆序打印

我在前面几篇博客中<C语言实现链表节点的插入><C语言实现链表节点的删除><C实现头插法和尾插法来构建链表><C语言实现链表的基本操作>实现了链表的很多增删改查操作.这里我们要来实现链表的逆序打印,使用C来实现.代码上传至 https://github.com/chenyufeng1991/ReverseLinkedList . 基本算法是: (1)使用尾插法构建原链表: (2)依次遍历原链表: (3)取出遍历中的节点使用头插法建立一个新链表: (4)打印逆

(转载)C语言单链表实现19个功能完全详解

最近在复习数据结构,想把数据结构里面涉及的都自己实现一下,完全是用C语言实现的. 自己编写的不是很好,大家可以参考,有错误希望帮忙指正,现在正处于编写阶段,一共将要实现19个功能.到目前我只写了一半,先传上来,大家有兴趣的可以帮忙指正,谢谢 在vs2010上面编译运行无错误. 每天都会把我写的新代码添加到这个里面.直到此链表完成. #include "stdafx.h" #include "stdio.h" #include <stdlib.h> #in

最全C 语言常用算法详解-排序-队列-堆栈-链表-递归-树

具体 源代码 案例查看github,持续更新中............ github地址:https://github.com/Master-fd/C-Algorithm 1. 二分法查找 2. 冒泡排序 3. 插入排序 4. 希尔排序 5. 选择排序 6. 快速排序 7. 单链表实现堆栈 8. 单链表实现队列 9. 普通单链表 10. 递归实现斐波拉契数列 11. 递归实现strlen 12. 循环链表 13. 求素数 14. 双向链表 15. 顺序表实现队列 16. 顺序表实现栈 17. 顺

C语言堆栈入门——堆和栈的区别 -- 转

在 计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念.堆栈:一种数据结构.一 个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈.我身边的一些编程的朋友以及在网上看 帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方请朋友们不吝赐教,这对于大家学习会有很大帮助. 数据结构的栈和堆 首先在数据结构上要知道堆栈,尽管我们这么称呼