数据结构代码及解析-----栈

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <malloc.h>
  4
  5 typedef struct Node//定义结点
  6 {
  7     int data;
  8     struct Node *pNext;
  9 }NODE, *PNODE;
 10
 11 typedef struct Stack//定义栈,栈相当于一个箱子;共有2个结点,一个表示箱顶一个表示箱底
 12 {
 13     PNODE pTop;//箱顶
 14     PNODE pBottom;//箱底
 15 }STACK, *PSTACK;
 16
 17 void init(PSTACK pS)
 18 {
 19     pS->pTop = (PNODE)malloc(sizeof(NODE));//先造出一个空栈
 20     if (NULL == pS->pTop)
 21     {
 22         printf("动态内存分配失败!\n");
 23         exit(-1);
 24     }
 25     else
 26     {
 27         pS->pBottom = pS->pTop;
 28         pS->pBottom->pNext = NULL;//或使用pS->pTop->pNext = NULL
 29         //因为他们刚开始指向同一个地方---箱底,只要箱底的指针域为空就行了
 30     }
 31 }
 32
 33 void push(PSTACK pS, int val)
 34 {
 35     PNODE pNew = (PNODE)malloc(sizeof(NODE));//创建一个新的结点放到栈里
 36     if (NULL == pNew)
 37     {
 38         printf("动态内存分配失败!\n");
 39         exit(-1);
 40     }
 41
 42     pNew->data = val;
 43     pNew->pNext = pS->pTop;
 44     pS->pTop = pNew;
 45
 46     return;
 47 }
 48
 49 void traverse(PSTACK pS)//遍历输出
 50 {
 51     PNODE p = pS->pTop;//注意一定要用p临时存放箱顶的结点指针,不然结束后箱顶的结点指针就变了---会影响其他的函数执行
 52
 53     while (p != pS->pBottom)//当p == pS->pBottom时结束, 此时p已经变成了pS->pBottom箱底
 54     {
 55         printf("%d  ", p->data);
 56         p = p->pNext;
 57     }
 58     putchar(10);
 59
 60     return;
 61 }
 62
 63 bool empty(PSTACK pS)
 64 {
 65     if (pS->pTop == pS->pBottom)
 66     {
 67         return true;
 68     }
 69     else
 70         return false;
 71 }
 72 //把pS所指向的栈出栈一次,并把出栈的元素存入pVal所指向的变量
 73 bool pop(PSTACK pS, int *pVal)
 74 {
 75     if (empty(pS))
 76     {
 77         return false;
 78     }
 79     else
 80     {
 81         PNODE r = pS->pTop;
 82         *pVal = r->data;
 83         pS->pTop = r->pNext;
 84
 85         free(r);
 86         r = NULL;
 87     }
 88
 89     return true;
 90 }
 91
 92
 93 void clear(PSTACK pS)//清空--释放内存
 94 {
 95     if (empty(pS))
 96         return;
 97     else
 98     {
 99         PNODE p = pS->pTop;
100         PNODE q = NULL;
101
102         while (p != pS->pBottom)
103         {
104             q = p->pNext;
105             free(p);
106             p = q;//结束时p(pS->pTop)已经指向了pS->pBottom箱底,但pS->pTop的内容并不是空结点的
107         }
108
109         pS->pTop = pS->pBottom;//所以在清空的时候, 要将pS->pTop的数据域也为空
110     }
111 }
112
113 int main(void)
114 {
115     int val;
116     STACK S;
117     init(&S);
118
119     push(&S, 1);
120     push(&S, 2);
121     push(&S, 3);
122     push(&S, 4);
123     push(&S, 5);
124     traverse(&S);
125
126     pop(&S, &val);//只出栈一次
127     printf("你出栈的结点的数据域存储的数是:%d\n", val);
128     traverse(&S);
129
130     clear(&S);
131     traverse(&S);//没有的话会空一行
132
133     return 0;
134 }
时间: 2024-10-25 15:37:25

数据结构代码及解析-----栈的相关文章

一步一步学习数据结构(三)栈的顺序存储结构实现代码

//栈这种逻辑结构的实现与一般线性表的实现类似,有两种存储方式:顺序存储和链式存储 //先学习顺序存储 //1. #include<stdio.h> #include<stdlib.h> #define null NULL #define SIZE 100 typedef int dataType ; typedef struct { dataType data[SIZE]; int top; }cStack,*cStackPointer; //初始化栈空间 void initSt

Python2 基本数据结构源码解析

Python2 基本数据结构源码解析 Contents 0x00. Preface 0x01. PyObject 0x01. PyIntObject 0x02. PyFloatObject 0x04. PyStringObject 0x05. PyListObject 0x06. PyDictObject 0x07. PyLongObject 0x00. Preface 一切皆对象,这是Python很重要的一个思想之一,虽然在语法解析上有些细节还是不够完全对象化,但在底层源码里,这个思想还是贯穿

JS代码预解析原理、函数相关、面向对象

JS重要知识点 这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原理(包括三个段落): 函数相关(包括 函数传参,带参数函数的调用方式,闭包): 面向对象(包括 对象创建.原型链,数据类型的检测,继承). JS代码预解析原理 /****************** JS代码预解析原理 ******************//*JS代码预解析.变量作

MYSQL 源代码 编译原理 AST和解析树 代码语法解析

MYSQL 源代码 编译原理 AST和解析树 代码语法解析 http://blog.csdn.net/wfp458113181wfp/article/details/17082355 使用AST树 分类:             antlr              2013-12-02 22:39     255人阅读     评论(0)     收藏     举报 目录(?)[+] 第五章使用AST树中间结果来计算表达式值 创建ASTS 第五章.使用AST树中间结果来计算表达式值 现在我们已

11、蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现

11.蛤蟆的数据结构笔记之十一栈的应用之表达式求值实现 本篇名言:"人生不售来回票,一旦动身,绝不能复返." 继续栈应用实现,这次是来看下表达式求值的栈实现. 欢迎转载,转载请标明出处: 1.  表达式求值 表达式求值是设计语言编译中的一个基本问题,它的实现是栈应用的又一个典型例子. 任何一个表达式都是由操作数(Operand).运算符(operator)和界限符(delimiter)组成. 操作数可以是常数也可以是变量或变量的标识符. 运算符可以分为算术运算符.关系运算符和逻辑运算符

数据结构学习笔记之栈

栈(stack)  是限定仅在表尾进行插入或删除操作的线性表.因此,对栈来说,表尾端有其特殊含义,称为栈项(top),相应地,表头端称为栈底(bottom).不含元素的空表称为空栈. 栈有两种存储表示方法:顺序栈和链栈.顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置.通常的习惯做法是以top=0表示空栈,鉴于C语言中数组的下标约定从0开始,则当以C作描述语言时,如此设定会带来很大不便:另一方面,由于栈在使用过程

5、蛤蟆的数据结构笔记之五链栈实现

5.蛤蟆的数据结构笔记之五链栈实现 本篇名言:"人生就像奕棋,一步失误,全盘皆输." 昨天对栈和队列进行了定义.这次我们来看下如何使用代码来实现链栈和链队列,后续蛤蟆会记录如何将栈应用到实际问题中. 栈一般是顺序结构,但是也可以采用链式存储结构,具体如下实现. 欢迎转载,转载请标明出处: 1.  定义结构体 #define MAX_STACKS10 typedef struct { intkey; /*otherfields */ }element; typedef struct st

java数据结构与算法之栈(Stack)设计与实现

[版权申明]转载请注明出处(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53362993 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈设计与实现 ??本篇是jav

一些可运行的C语言数据结构代码

网上有很多C语言数据结构代码:有的不能运行:下面是一些能运行的,和运行截图:备用一下: 1 队列 #include<stdio.h> #include<stdlib.h> #define QUEUE_SIZE 50 typedef struct SeqQueue { int data[QUEUE_SIZE]; int front; int rear; }Queue; Queue *InitQueue() { Queue *q = (Queue *)malloc(sizeof(Que