数据结构与算法分析 3.23 — 用一个数组实现三个(多个)栈

一、题目

用一个数组实现三个(或多个)栈

二、解答

用一个数组实现三个乃至多个栈,如果想使用一个数组构造两个栈的思想则行不通;

考虑使用静态链表,数组结点中存在两个域,关键字域与指示栈的前驱的游标,则可以使三个栈可以用一个数组表示;

ADT的关键术语:

Capacity: 数组的容量;

Size: 数组已经存储的数据元素个数;

Top_Fst:First栈的栈顶;

三、代码

struct Node;
typedef struct Node ElementType;
typedef struct StackRecord * Stack;

struct Node
{
    Type Key;
    int Pre;
};

struct StackRecord
{
    int Capacity;
    int Size;
    int Top_Fst;
    int Top_Snd;
    int Top_Trd;
    ElementType *Array;
};

Stack CreateStack( int MaxElements );
int IsEmpty_Fst( Stack S );
int IsFull( Stack S );
void Push_Fst( Type Key, Stack S );
Type Pop_Fst( Stack S );
void MakeEmpty( Stack S );
void DisposeStack( Stack S );

Stack CreateStack( int MaxElements )
{
    Stack S;

    S = (Stack)malloc( sizeof(struct StackRecord) );
    if ( S == NULL )
    {
        printf( "Out of space" );
        return NULL;
    }

    S->Array = (ElementType *)malloc( sizeof(ElementType) * MaxElements );
    if ( S->Array == NULL )
    {
        printf( "Out of space" );
        return NULL;
    }

    S->Capacity = MaxElements;
    MakeEmpty(S);

    return S;
}

int IsEmpty_Fst( Stack S )
{
    return S->Top_Fst == -1;
}

int IsFull( Stack S )
{
    return S->Size == S->Capacity;
}

void MakeEmpty( Stack S )
{
    if ( S != NULL )
    {
        S->Size =0;
        S->Top_Fst = -1;
        S->Top_Snd = -1;
        S->Top_Trd = -1;
    }
}

void Push_Fst( Type Key, Stack S )
{
    int TmpCell;

    if ( IsFull(S) )
        printf( "Stack is full" );
    else
    {
        TmpCell = S->Top_Fst;
        S->Top_Fst = S->Size;
        S->Array[S->Top_Fst].Key = Key;
        S->Array[S->Top_Fst].Pre = TmpCell;
        S->Size++;
    }
}

Type Pop_Fst( Stack S )
{
    int TmpCell;

    if ( IsEmpty_Fst(S) )
        printf( "Stack is empty" );
    else
    {
        TmpCell = S->Top_Fst;
        S->Top_Fst = S->Array[TmpCell].Pre;
        S->Size--;
    }

    return S->Array[TmpCell].Key;
}

void DisposeStack( Stack S )
{
    if ( S != NULL )
    {
        free( S->Array );
        free( S );
    }
}
时间: 2024-10-10 03:03:55

数据结构与算法分析 3.23 — 用一个数组实现三个(多个)栈的相关文章

【转】一个数组中有三个数字a、b、c只出现一次,其他数字都出现了两次。请找出三个只出现一次的数字。

转自:http://zhedahht.blog.163.com/ 题目:一个数组中有三个数字a.b.c只出现一次,其他数字都出现了两次.请找出三个只出现一次的数字. 分析:在博客http://zhedahht.blog.163.com/blog/static/2541117420071128950682/中我们讨论了如何在一个数组中找出两个只出现一次的数字.在这道题中,如果我们能够找出一个只出现一次的数字,剩下两个只出现一次的数字就很容易找出来了. 如果我们把数组中所有数字都异或起来,那最终的结

面试题1:找出一个数组中三个只出现一次的数字

version1: 找出一个数组中一个只出现一次的数字,其他数字都出现两次:将所有数字异或,得到的结果即为只出现一次的. version2: 找出一个数组中两个只出现一次的数字,其他数字都出现两次:将所有数字异或,得到的结果即为x=a^b, index为x中第一个为1的位,则a 和b中第index为必然有一个为1,有一个为0.据此将所有数据分为两组,一组的第index为都为1,另一组第index为都为0,第一组数字异或得到a,第二组数字异或得到b. 时间复杂度为o(n),空间复杂度为o(1).

【Weiss】【第03章】练习3.22、3.23、3.24:无代码题,栈的思考题

[练习3.22] a.提出支持栈的Push和Pop操作以及第三种操作FindMin的数据结构,其中FindMin 返回该数据结构的最小元素,所有操作在最坏情况下的运行时间都是O(1). b.证明,如果我们加入第四种操作DeleteMin,那么至少有一种操作必须花费Ω(logN)时间. [练习3.23] 说明如何用一个数组实现三个栈. [练习3.24] 在2.4节中用于计算斐波那契的递归例程如果在N=50下运行,栈空间有可能用完吗,为什么?

《数据结构与算法分析:C语言描述》复习——第八章“并查集”——并查集

2014.06.18 14:16 简介: “并查集”,英文名为“union-find set”,从名字就能看出来它支持合并与查找功能.另外还有一个名字叫“disjoint set”,中文名叫不相交集合.可能我们倾向于用最短的名字,所以就出现了“并查集”翻译为“disjoint set”的情况.并查集是一种树形结构,但与之前讲的树不同的是,这里的树节点只记录父节点,因此是一对一的,就可以用数组来表示并查集. 图示: 并查集可以认为是一个“森林”,也就是多棵树: 既然是并查集,先看看合并3和5之后结

《数据结构与算法分析:C语言描述》复习——第五章“堆”——二叉堆

2014.06.15 22:14 简介: 堆是一种非常实用的数据结构,其中以二叉堆最为常用.二叉堆可以看作一棵完全二叉树,每个节点的键值都大于(小于)其子节点,但左右孩子之间不需要有序.我们关心的通常只有堆顶的元素,而整个堆则被封装起来,保存在一个数组中. 图示: 下图是一个最大堆: 实现: 优先队列是STL中最常用的工具之一,许多算法的优化都要利用堆,使用的工具就是优先队列.STL中的优先队列通过仿函数来定义比较算法,此处我偷懒用了“<”运算符.关于使用仿函数的好处,我之后如果有时间深入学习S

数据结构与算法分析(4)算法分析的编程练习

    数据结构和算法分析的编程习题.     (1)生成不重复的随机数,并且具有上界和下界.可以产生有序的,也可以产生无序的. 知识: C编程语言不允许返回整个数组作为函数的参数.但是,您也可以返回一个指针,没有索引到一个数组中指定数组的名称. 例如: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 5 int *getRandom(){ 6 static int r[10]; 7 int i

数据结构与算法分析 - 7 - 图

1.图的相关概念 图:G = (V,E),集合V中的元素被称为顶点,集合E中的元素是集合V中的某一对顶点(u,v)之间的边. 约定集合V和集合E均为有限集,其规模分别记为n = | V |,e = | E |. 边:顶点之间存在的某种关系就是边.可分为有向边和无向边.若边(u,v)中的顶点u和v的次序无所谓,即(u,v) = (v,u),边(u,v)即为无向边,反之即为有向边. 有向图和无向图:当一个图中的所有边都是无向边时,该图为无向图.而只要一个图中存在有向边,该图就是有向图. 度:与某顶点

数据结构1:数据结构和算法分析

问题引出 假设有一道题目:有一组N个数而要确定其中第k个最大者,我们称之为选择问题,那么这个程序如何编写?最直观地,至少有两种思路: 1.将N个数读入一个数组中,再通过某种简单的算法,比如冒泡排序法,以递减顺序将数组排序,则第k个位置上的元素就是我们需要的元素 2.稍微好一些的做法,将k个元素读入数组并以递减顺序排序,接着将接下来的元素再逐个读入,当新元素被读到时,如果它小于数组中的第k个元素则忽略之,否则将其放到数组中正确的位置上,同时将数组中的一个元素挤出数组,当算法终止时,位于第k个位置上

数据结构与算法分析(四)——不相交集

基本介绍 一个集合S,集合中一个元素a.a的等价类是S的一个子集,该子集包含所有与a有关系的元素. 等价类形成是对S的一个划分且S中的每一个成员恰好出现在一个等价类中.这样,判断a与b是否有关系, 只需要判断a与b是否在一个等价类中即可. 对于集合S划分,取任意两个等价类,Si与Sj,如果Si∩Sj = ∅,则称这些集合不相交. 对于不相交集,有两种操作,Union/Find操作.Find操作找包含给定元素的集合(等价类)名字. Union把两个等价类合并成一个新的等价类. 数据结构:采用树来表