[数据结构与算法] : 栈的链式实现

头文件

 1 typedef int ElementType;
 2
 3 #ifndef _STACKLI_H_
 4 #define _STACKLI_H_
 5
 6 struct Node;
 7 typedef Node *PtrToNode;
 8 typedef PtrToNode Stack;
 9
10 int IsEmpty(Stack S);
11 Stack CreateStack(void);
12 void DisposeStack(Stack S);
13 void MakeEmpty(Stack S);
14 void Push(ElementType X, Stack S);
15 ElementType Top(Stack S);
16 void Pop(Stack S);
17
18 #endif

源文件

 1 #include "stackli.h"
 2 #include <malloc.h>
 3 #include <stdlib.h>
 4
 5 struct Node
 6 {
 7     ElementType Element;
 8     PtrToNode Next;
 9 };
10
11 int IsEmpty(Stack S)
12 {
13     return S->Next == NULL;
14 }
15
16 // 创建栈的头节点
17 Stack CreateStack(void)
18 {
19     Stack S = (Stack)malloc( sizeof(struct Node) );
20     if( S == NULL )
21     {
22         fprintf(stderr, "%s\n", "Out of space!!!");
23         exit(-1);
24     }
25     S->Next = NULL;
26     return S;
27 }
28
29 // 销毁栈(包括头节点)
30 void DisposeStack(Stack S)
31 {
32     MakeEmpty(S);
33     free(S);
34 }
35
36 // 清空栈就是弹出所有数据
37 void MakeEmpty(Stack S)
38 {
39     if(S == NULL)
40     {
41         fprintf(stderr, "%s\n", "Must use CreateStack first");
42         exit(-1);
43     }
44     else
45         while( !IsEmpty(S) )
46             Pop(S);
47 }
48
49 // 进栈, 插入到头节点之后
50 void Push(ElementType X, Stack S)
51 {
52     PtrToNode TmpCell = (PtrToNode)malloc( sizeof(struct Node) );
53     if(TmpCell == NULL)
54     {
55         fprintf(stderr, "%s\n", "Out of space!!!");
56         exit(-1);
57     }
58     else
59     {
60         TmpCell->Element = X;
61         TmpCell->Next = S->Next;
62         S->Next = TmpCell;
63     }
64 }
65
66 // 返回栈顶元素, 注意S不能为空
67 ElementType Top(Stack S)
68 {
69     if( IsEmpty(S) )
70     {
71         fprintf(stderr, "%s\n", "Empty stack");
72         return -1;
73     }
74     else
75         return S->Next->Element;
76 }
77
78 // 出栈, 删除头节点的后继
79 void Pop(Stack S)
80 {
81     if( IsEmpty(S) )
82     {
83         fprintf(stderr, "%s\n", "Empty stack");
84     }
85     else
86     {
87         PtrToNode P = S->Next;
88         S->Next = P->Next;
89         free(P);
90     }
91 }

测试文件

 1 #include <stdio.h>
 2 #include "stackli.h"
 3
 4 main( )
 5 {
 6     Stack S;
 7     int i;
 8
 9     S = CreateStack( );
10     for( i = 0; i < 10; i++ )
11         Push( i, S );
12
13     while( !IsEmpty( S ) )
14     {
15         printf( "%d ", Top( S ) );
16         Pop( S );
17     }
18
19     DisposeStack( S );
20     return 0;
21 }
时间: 2024-10-14 19:09:19

[数据结构与算法] : 栈的链式实现的相关文章

guoshiyv 数据结构与算法2-1 线性链式存储

线性链式存储:   包含两部分:1.存储的单个元素 2.指针,指向下一个的地址 typedef struct() { ElementType Data; struct Node *Next; }List ; List L,Ptrl;        Ps:算法应保证具有可移植性,(ElementType) 表长函数,相比顺序数组存储复杂,需要遍历所有元素 定义一个新指针,始终指向当前的这个链表. int length(List *Ptrl) { int i=0; List *p=Ptrl; whi

数据结构与算法2-4 堆栈链式存储

链表中,只有一端进行插入与删除 在表头的位置,以避免需要知道实际数据长度 结构: typedef struct Node() { ElementType data; struct node *Next; }List; List *Ptrl; 构造: List *empty() { List *Ptrl; Ptrl=(List *)malloc(sizeof(List)); Ptrl->Next=NULL; return Ptrl; } 判断是否是空表 int isEmpty(List *Ptrl

数据结构Java实现05----栈:顺序栈和链式堆栈

数据结构Java实现05----栈:顺序栈和链式堆栈 一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除操作. 先进后出:堆栈中允许进行插入和删除操作的一端称为栈顶,另一端称为栈底.堆栈的插入和删除操作通常称为进栈或入栈,堆栈的删除操作通常称为出栈或退栈. 备注:栈本身就是一个线性表,所以我们之前讨论过线性表的顺序存储和链式存储,对于栈来说,同样适

栈的链式结构表示与实现——自己写数据结构

今天给大家介绍栈的链式结构,用dev-c++4.9.9.2调试通过,少废话直接上代码: 数据结构体存放文件stacklist.h文件如下 #ifndef _STACKLIST_H_ #define _STACKLIST_H_ typedef struct _Node { int data; struct _Node *pre; struct _Node *next; }Node,*pNode; typedef struct _Stack_Header { struct _Node *botton

数据结构_线性表_顺序存储之1顺序栈2共享栈_链式存储之链栈_栈的应用举例

1>//栈是先进后出,后进先出的线性表 简称LIFO线性表 //栈的顺序存储结构成为顺序栈(sequebtial stack). //顺序栈利用一组地址连的存储单元依次存放从栈底到 栈顶的数据元素,通常用一维数组存放栈的元素 //"指针"top并非指针,而是表示栈顶元素的当前位置 //top不是指针型变量而是整形变量,top=0空栈,top=MaxSize 表示满栈,当top>maxsize 表示栈溢出 代码 #include <stdio.h> #includ

数据结构 - 栈的链式存储

栈的链式存储 1 栈的链式表示 栈的链式存储结构称为链栈,是运算受限的单链表.其插入和删除操作只能在表头位置上进行.因此,链栈没有必要像单链表那样附加头结点,栈顶指针top就是链表的头指针.图3-4是栈的链式存储表示形式. 链栈的结点类型说明如下: typedef struct Snode { ElemType data ; struct Snode *next ; } SNode, *Link_Stack ; 链栈基本操作的实现 2 链栈基本操作的实现 (1) 栈的初始化 SNode *Ini

数据结构与算法--栈、队列(队列)

Hello,everybody.我们又见面了.今天我们来学习一下队列这个数据结构,let's Go,开始我们的征程吧. 首先,举两个生活中的常见例子.相信大家,在用电脑工作娱乐时,都会碰到这样的现象.当我们点击程序或进行其他操作时,电脑处于死机状态.正当我们准备Reset时,它突然像打了鸡血似的,突然把刚才我们的操作,按顺序执行了一遍.之所以会出现这个现象,是因为操作系统的多个程序,需要通过一个管道输出,而按先后顺序排队造成的. 还有有个例子,在我们打客服热线时,有时会出现等待的现象.当其他客户

栈的链式存储结构和入栈出栈操作

参考<大话数据结构>P98~99——栈的链式存储结构. 进栈: 出栈: 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 typedef string status;//用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便 6 7 //栈的结点 8 //包含data,和指向下一个结点

栈的链式存储及基本操作

栈的链式存储结构称为链栈,它是运算受限的单链表,其插入和删除操作仅限制在栈顶进行. 先将练习结果贴下 相关C代码如下: /*数据结构之栈*/ #include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef int DataType; /*定义栈的结构体类型*/ typedef struct NODE{ DataType data; NODE * pNext; }Node,* PNode; typede