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

头文件

 1 typedef int ElementType;
 2
 3 #ifndef _STACK_AR_
 4 #define _STACK_AR_
 5
 6 struct StackRecord;
 7 typedef struct StackRecord *Stack;
 8
 9 int IsEmpty(Stack S);
10 int IsFull(Stack S);
11 Stack CreateStack(int MaxElements);
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 ElementType TopAndPop(Stack S);
18
19 #endif

源文件

 1 #include "stackar.h"
 2 #include <malloc.h>
 3 #include "fatal.h"
 4 #include <stdlib.h>
 5
 6 #define EmptyTOS (-1)
 7 #define MinStackSize (5)
 8
 9 struct StackRecord
10 {
11     int Capacity;
12     int TopOfStack;
13     ElementType *Array;
14 };
15
16 int IsEmpty(Stack S)
17 {
18     return S->TopOfStack == EmptyTOS;
19 }
20
21 int IsFull(Stack S)
22 {
23     return S->TopOfStack == S->Capacity - 1;
24 }
25
26 Stack CreateStack(int MaxElements)
27 {
28     Stack S;
29
30     if(MaxElements < MinStackSize)
31         Error("Stack size is to small!");
32
33     S = (Stack)malloc( sizeof(struct StackRecord) );
34     if( S == NULL )
35         FatalError("Out of Space!");
36
37     S->Array = (ElementType*)malloc( sizeof(ElementType) * MaxElements );
38     if(S->Array == NULL)
39         FatalError("Out of Space!");
40     S->Capacity = MaxElements;
41     MakeEmpty(S);
42
43     return S;
44 }
45
46 void DisposeStack(Stack S)
47 {
48     if(S != NULL)
49     {
50         free(S->Array);
51         free(S);
52     }
53 }
54
55 void MakeEmpty(Stack S)
56 {
57     if(S == NULL)
58         Error("Create stack first!");
59     else
60         S->TopOfStack = EmptyTOS;
61 }
62
63 void Push(ElementType X, Stack S)
64 {
65     if( IsFull(S) )
66         Error("Full Srack!");
67     else
68         S->Array[++S->TopOfStack] = X;
69 }
70
71 ElementType Top(Stack S)
72 {
73     if( IsEmpty(S) )
74     {
75         Error("Empty Srack!");
76         return 0; /* return value used to avoid warning */
77     }
78     else
79         return S->Array[S->TopOfStack];
80 }
81
82 void Pop(Stack S)
83 {
84     if( IsEmpty(S) )
85         Error("Empty Srack!");
86     else
87         --S->TopOfStack;
88 }
89
90 ElementType TopAndPop(Stack S)
91 {
92     if( IsEmpty(S) )
93     {
94         Error("Empty Srack!");
95         return 0; /* return value used to avoid warning */
96     }
97     else
98         return S->Array[S->TopOfStack--];
99 }

测试文件

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

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

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

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

JavaScript数据结构和算法----栈

前言 栈是一种遵循后进先出(LIFO)原则的有序集合,新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另外一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底.可以想象桌上的一叠书,或者厨房里的堆放的盘子. 一.栈的创建 可以创建一个类来表示栈 //1.创建一种数据结构来保存栈里面的数据,这里选择数组 //2.声明一些栈的方法 // push(element(s)) : 添加一个或一些元素到栈顶 // pop() : 移除栈顶的元素,同时返回被移除的元素. // peek() : 返回栈顶

数据结构与算法 — 进一步认识数组

数组 提到数组,相信大家的都不陌生,毕竟每个编程语言都会有它的影子. 数组是最基础的数据结构,尽管数组看起来非常的基础简单,但这个基础的数据结构要掌握其精髓,也不是那么简单事. 开门见山 数组(Array)是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据. 这个定义有几个关键词,也是数组的精髓所在.下面就从这几个关键词进一步理解数组. 第一个是线性表.顾名思义,线性表的特征就是数据排成像一条线一样的结构.每个线性表的数据最多只有前和后两个方向.除了数组,链表.队列.栈等

javascript数据结构与算法---栈

在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈.栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样操作很快,而且容易实现. 一:对栈的操作. 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端陈为栈顶.比如餐馆里面洗盘子,只能先洗最上面的盘子,盘子洗完后,也只能螺到这一摞盘子的最上面.栈被称为 "后入先出"(LIFO)的数据结构. 由于栈具有后入先出的特点

数据结构与算法-栈和队列

一.简介 众所周知,线性表是数据结构的基础,通常有两种实现方式:数组和链表.栈和队列是最常用的数据结构,它们基于线性表实现. 二.栈 定义:栈是限定仅在表尾进行插入和删除操作的线性表,即FILO. 栈被经常类比于弹夹,即先被压如弹夹的子弹最后被打出.根据线性表的实现方式得知,栈的实现方式有两种:数组实现和链表实现. 栈的数组实现: package basic.data_structure.cha01; /** * 栈:先进后出(FILO),只允许在栈顶操作元素 * 栈的基本操作: * 初始化栈.

数据结构与算法—栈

什么是栈 百度百科上,栈是这么定义的: 栈(stack)又名堆栈,它是一种运算受限的线性表.限定仅在表尾进行插入和删除操作的线性表.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素. 稍微介绍一下关键名词: 运算受限:也就是这个表你不能随便的删除插入.只能按照它的规则进行插入删除.比如栈就只能在一端就行插入和删除.同样,

javascript数据结构与算法——栈

前言: 栈就是和列表类似的一种数据结构,不过栈的特点是'后人先出'.栈是一种高效的数据结构,因为数据只能在栈顶添加或删除,所以这样操作很快,而且容易实现. 1. 栈的介绍: 栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端被称为栈顶,另一端称为栈底.比如饭店罗盘子,只能从最上面取盘子,盘子洗干净后,也只能罗在做上面.栈被称为一种先入后出的(LIFO)的数据结构. 示意图:

15. C#数据结构与算法 -- 栈

这节我们讨论了两种好玩的数据结构,栈和队列. 什么是栈, 所谓的栈是栈(Stack)是操作限定在表的尾端进行的线性表.表尾由于要进行插入.删除等操作,所以,它具有特殊的含义,把表尾称为栈顶(Top) ,另一端是固定的,叫栈底(Bottom) .当栈中没有数据元素时叫空栈(Empty Stack).这个类似于送饭的饭盒子,上层放的是红烧肉,中层放的水煮鱼,下层放的鸡腿.你要把这些菜取出来,这就引出来了栈的特点先进后出(First in last out).   具体叙述,加下图: 栈通常记为:S=

python数据结构与算法——栈

# 栈# 其实python里面的list就可以当栈使用啦,用collections.deque也可以# 1. 入栈 list.append(item)# 2. 出栈 item = list.pop()# 3. 对于首元素出栈,还可以 item = list.pop(0) 和队列概念一样# 4. 其实还可以任意元素出栈 item = list.pop(i) 相当于删除第i个元素# 注意3,4是很耗时间的 栈可以方便用来判断一个字符串是否回文,但是要在一个长字符串中找到最大的回文一般用的数据结构是后