实现特殊的栈和队列

利用一个固定数组实现栈和队列

class ArrayStack //用数组实现栈
{
public:
    ArrayStack(int initsize) //创建一个固定长度的数组
    {
        if (initsize < 0)
        {
            cout << "数组长度小于0" << endl;
        }
        else
        {
            array = vector<int>(initsize - 1);
            size = 0;
        }
    }

    void push(int obj)
    {
        if (size == array.size())
            cout << "栈已满" << endl;
        else
            array[size++] = obj;
    }

    int pop()
    {
        if (size == 0)
            cout << "栈为空" << endl;
        else
            return array[--size];

    }

    int top()
    {
        if (size == 0)
            return NULL;
        else
            return array[size - 1];
    }

private:
    vector<int> array;
    int size;
};

class ArrayQueue //用数组实现队列
{
public:
    ArrayQueue(int initsize)
    {
        if (initsize < 0)
            cout << "数组长度小于0" << endl;
        else
        {
            vector<int> array(initsize-1);
            size = 0;
            start = 0;
            end = 0;
        }
    }

    void push(int obj)
    {
        if (size == array.size())
            cout << "队列已满" << endl;
        else
        {
            array[end++] = obj;
            size++;
            if (end == array.size()) //当队尾到达数组的最后一个位置时,队尾指针转而指向数组的第一个位置
                end = 0;
        }
    }

    int pop()
    {
        if (size == 0)
            cout << "队列为空" << endl;
        else
        {
            size--;
            int tmp = start;
            if (start == array.size() - 1) //当队首到达数组的最后一个元素时,经过pop操作,指向数组的第一个元素
                start = 0;
            else
                start++;
            return array[tmp];
        }
    }

    int top()
    {
        if(size == 0)
            return NULL;
        else
            return array[start];
    }

private:
    vector<int> array;
    int size;
    int start; //指向队首
    int end;  //指向队尾元素的后一个位置,该位置为空
};

具有返回min功能的栈

使用两个栈,一个为data栈,一个为min栈。在进行push操作时,首先向data栈中push值,如果push的值小于min栈的栈顶,则向min栈中push这个值,如果大于等于min栈的栈顶,则再push一个min栈栈顶的值。在进行pop操作时,data栈和min栈都对栈顶进行pop。进行top操作,即对data栈取top,进行min操作,即对min栈取top。

class MinStack
{
public:
    void push(int value)
    {
        stackdata.push(value);
        if (stackmin.empty() || value<stackmin.top()) //压入元素小于min栈顶,则压入该元素;否则再压入一个栈顶元素。
            stackmin.push(value);
        else stackmin.push(stackmin.top());
    }

    void pop()
    {
        if (!stackmin.empty())
        {
            stackmin.pop();
            stackdata.pop();
        }
        else
            cout << "栈为空" << endl;
    }

    int top()
    {
        return stackdata.top();
    }

    int min()
    {
        return stackmin.top();
    }

private:
    stack<int> stackmin;
    stack<int> stackdata;
};

用两个队列实现栈

使用两个队列,一个为data队列,另一个为help队列。在进行push操作时,向data队列中push值。在进行pop操作时,不断地将data队列的首元素弹出并且压入help队列中,直到data队列中只剩下一个元素,将该元素pop,交换data队列和help队列。在进行top操作时,与pop操作不同的是,不仅要返回data队列中的最后一个元素,还要将这个元素压入help栈中。最后交换data队列和help队列。

class QueueStack
{
public:
    void push(int obj)
    {
        queuedata.push(obj);
    }

    void pop()
    {
        if (queuedata.empty())
            cout << "栈为空" << endl;
        else
        {
            while (queuedata.size() > 1)
            {
                queuehelp.push(queuedata.front());
                queuedata.pop();
            }
            queuedata.pop();
            queue<int> tmp = queuehelp;
            queuehelp = queuedata;
            queuedata = tmp;
        }
    }

    int top()
    {
        if (queuedata.empty())
            return NULL;
        else
        {
            while (queuedata.size() > 1)
            {
                queuehelp.push(queuedata.front());
                queuedata.pop();
            }
            int res = queuedata.front();
            queuedata.pop();
            queuehelp.push(res);
            queue<int> tmp = queuehelp;
            queuehelp = queuedata;
            queuedata = tmp;
            return res;
        }
    }

private:
    queue<int> queuedata;
    queue<int> queuehelp;
};

用两个栈实现队列

使用两个栈,一个为push栈,另一个为pop栈。在进行push操作时,向push栈中push值。在进行pop操作时,如果pop栈不为空,直接在pop栈执行pop操作;在pop栈为空时,则将push栈中的栈顶元素依次弹出并且压入pop栈中,再对pop栈执行pop操作。top操作与pop类似。

class StackQueue
{
public:
    void push(int obj)
    {
        stackpush.push(obj);

    }

    void pop()
    {
        if (stackpop.empty() && stackpush.empty())
            cout << "队列为空" << endl;
        else if (stackpop.empty())
        {
            while (!stackpush.empty())
            {
                stackpop.push(stackpush.top());
                stackpush.pop();
            }
        }
        stackpop.pop();
    }

    int top()
    {
        if (stackpop.empty() && stackpush.empty())
            return NULL;
        else if (stackpop.empty())
        {
            while (!stackpush.empty())
            {
                stackpop.push(stackpush.top());
                stackpush.pop();
            }
        }
        stackpop.top();
    }

private:
    stack<int> stackpush;
    stack<int> stackpop;
};

原文地址:https://www.cnblogs.com/gcheeze/p/10999250.html

时间: 2024-10-03 09:17:01

实现特殊的栈和队列的相关文章

快速记忆数组栈和队列函数push()和shift()

在js中,对数组的操作是比较常见的,有时候,我们需要模拟栈和队列的特性才能实现需求,今天来给大家用通俗易懂.简洁明了的几行文字,来告诉大家栈和队列的几个函数,如何快速记住. 首先,概念还是要知道的: 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻

3-3-行编辑程序-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第3章  栈和队列 - 行编辑程序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceStack.c        相关测试数据下载  链接? 无数据

用栈实现队列的效果

用两个栈实现队列的效果,可以入栈,出栈,判空等... 实现的栈基本功能 lstack.h #ifndef _LSTACK_H #define _LSTACK_H #include <stdexcept> using namespace std; // 基于链式表的堆栈 class Stack { public: // 构造过程中初始化为空堆栈 Stack (void) : m_top (NULL) {} // 析构过程中销毁剩余的节点 ~Stack (void) { for (Node* ne

javascript中的栈、队列。

                       javascript中的栈.队列 栈方法     栈是一种LIFO(后进先出)的数据结构,在js中实现只需用到2个函数 push()  接受参数并将其放置数组尾,并返回修改后的数组长度. pop()  移除数组尾的最后一项,并返回移除项的值. 事例: var colors = new Array();var count = colors.push("red","green"); count = colors.push(&

数据结构之栈和队列

数据结构学习继续向前推进,之前对线性表进行了学习,现在我们进入栈和队列的学习.同样我们先学习一些基本概念以及堆栈的ADT. 栈和队列是两种中重要的线性结构.从数据结构角度看,栈和队列也是线性表,只不过是受限的线性表.因此可以称为限定性数据结构.但从数据类型来看,他们是和线性表大不相同的两类重要的抽象数据类型. 栈:(stack)是限定仅在表尾进行相应插入和删除操作的线性表.因此,对栈来说,表尾有其特殊含义,称为栈顶,表头称为栈底,不含元素的空表称为空栈.栈一个重要特性就是后进先出.OK,我们来看

图解堆算法、链表、栈与队列(Mark)

原文地址: 图解堆算法.链表.栈与队列(多图预警) 堆(heap),是一类特殊的数据结构的统称.它通常被看作一棵树的数组对象.在队列中,调度程序反复提取队列中的第一个作业并运行,因为实际情况中某些时间较短的任务却可能需要等待很长时间才能开始执行,或者某些不短小.但很重要的作业,同样应当拥有优先权.而堆就是为了解决此类问题而设计的数据结构.--

第三章:1.栈和队列 -- 栈的表示及实现

前言: 栈和队列 是两种重要的线性结构.从数据结构角度来看,栈和队列也是线性表,它的特殊性在于其操作是线性表的子集,是操作受限的线性表,因此可以称作限定性的数据结构. (限定性:如.人为的规定线性表只能从表尾插入和删除结点数据元素,那么这样的线性表就是栈) 目录: 1.栈 2.栈的应用举例 3.栈与递归的实现 4.队列 5.离散事件模型 正文: 栈的定义 栈(stack) 如上所说,就是限定只能在表尾进行插入和删除的线性表.表尾 称为 栈顶(top), 表头 称为 栈底 (bottom),没有数

数据结构和算法分析(9)表栈和队列的实际应用(一)

    在接下来的几篇博文中,将介绍表.栈.队列在编程实践中的应用.     (1)表达式求值:     输入一个中缀表达式,操作符包括(+ - * / ^).转化为后缀表达式之后并计算表达式的值: 要求: 1.输入的中缀表达式必须是一个完整的字符串: 2.不限制数字的位数和正负,负数用()括起来: 代码如下: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 5 #define EmptyT

用两个栈实现队列-剑指Offer

用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路 一个栈的顺序是“后进先出”,再用一个栈把顺序颠倒过来就满足队列的“先进先出”规则了 用两个stack实现,stack1负责进队列,然后从stack2弹栈出队列,若stack2为空,再从stack1弹出到stack2 代码 import java.util.Stack; public class Solution { Stack<Integer> stack1 = new St

(hdu step 8.1.1)ACboy needs your help again!(STL中栈和队列的基本使用)

题目: ACboy needs your help again! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 73 Accepted Submission(s): 57   Problem Description ACboy was kidnapped!! he miss his mother very much and is very