数据结构-使用队列实现栈

1:考点:编程实现下面的stack,并根据stack完成queue的操作

class MyStack

{

void push(data);

void pop(&data);

bool isEmpty();

}

代码如下:

#include "stdafx.h"
#include<malloc.h>
#include <iostream>
#include <assert.h>
using namespace std;
/*单链表的节点,data表示节点的数据域,next指向下一个节点*/
class MyData
{
public:
    MyData() :data(0), next(NULL) {};//默认构造函数,这样表示后,主体中不用再写这个函数了
    MyData(int value) :data(value), next(NULL) {};//带参数的构造函数
    int data;//数据域
    MyData *next;//下一个节点
};

/*表示栈的定义,其中public成员top表示栈顶,由于不能直接操作栈底,因此这里没有定义栈底的指针。
在默认构造函数中,把栈顶指针top置空,表示此时栈为空栈。*/
class MyStack
{
public:
    MyStack() :top(NULL) {};//默认构造函数
    void push(MyData data);//进栈
    void pop(MyData *pData);//出栈
    bool IsEmpty();//是否为空栈
    MyData *top;//栈顶
};

//进栈
void MyStack::push(MyData data)
{
    MyData *pData = NULL;
    pData = new MyData(data.data);//生成新节点
    pData->next = top;
    top = pData;
    /*---测试---*/
    //cout << "栈顶地址:" << top << endl;
    //cout << "栈顶地址中的内容:" << top->data << endl;
    /*---*/
}

//判断栈是否为空
bool MyStack::IsEmpty()
{
    return(top == NULL);//如果top为空,则返回1,否则返回0
}

//出栈
void MyStack::pop(MyData *data)//将删除的节点保存到data中
{
    if (IsEmpty())//如果栈为空,直接返回
    {
        return;
    }
    data->data = top->data;//给传出的参数赋值
    MyData *p = top;//临时保存原栈顶节点
    top = top->next;//移动栈顶,指向下一个节点
    delete p;//释放原栈顶节点内存
}

int main()
{
    MyData data(0);//定义一个节点,使用带参数的构造函数
    MyStack s;//定义一个栈结构
    s.push(MyData(1));
    s.push(MyData(2));
    s.push(MyData(3));
    s.pop(&data);//第一次出栈,并且将删除的节点的数据保存到data参数中
    cout << "pop" << data.data << endl;
    s.pop(&data);//第二次出栈,并且将删除的节点的数据保存到data参数中
    cout << "pop" << data.data << endl;
    s.pop(&data);//第三次出栈,并且将删除的节点的数据保存到data参数中
    cout << "pop" << data.data << endl;
    cout << "Empty=" << s.IsEmpty() << endl;//打印判空
    return 0;
}

运行结果:

时间: 2024-10-10 09:23:57

数据结构-使用队列实现栈的相关文章

数据结构之队列and栈总结分析

一.前言: 数据结构中队列和栈也是常见的两个数据结构,队列和栈在实际使用场景上也是相辅相成的,下面简单总结一下,如有不对之处,多多指点交流,谢谢. 二.队列简介 队列顾名思义就是排队的意思,根据我们的实际生活不难理解,排队就是有先后顺序,先到先得,其实在程序数据结构中的队列其效果也是一样,及先进先出.    队列大概有如下一些特性: 1.操作灵活,在初始化时不需要指定其长度,其长度自动增加(默认长度为32) 注:在实际使用中,如果事先能够预估其长度,那么在初始化时指定长度,可以提高效率    

数据结构之队列和栈

No.1 抽象数据类型栈的定义 栈是限定在队尾进行操作的线性表,因此对于栈来说,队尾有特殊意义,称为栈顶,表头端成为栈底,没有任何元素的栈称为空栈 特点: 它是线性表 这个线性表只能在栈顶操作 No.2 栈的表示 栈的先进后出原则 使用栈存储数据元素,对数据元素的存和取有严格的限定,数据按照一定的顺序存储到栈中,当需要调取栈中的数据元素时,需要将该数据元素之后进栈的数据进行弹栈,该数据元素才能从栈中取出来 栈操作数据元素的方法 入栈 数据元素用栈的数据结构存储起来,也叫压栈 出栈 将数据元素从栈

数据结构之队列、栈

队列 ---  先进先出(FIFO) 栈 ---  后进先出(LIFO) 常见操作 1.入栈(队)2.出栈(队)3.判空4.判满5.初始化6.获取队列(栈)大小

数据结构丨队列和栈

队列 先入先出的数据结构 在 FIFO 数据结构中,将首先处理添加到队列中的第一个元素. 如上图所示,队列是典型的 FIFO 数据结构.插入(insert)操作也称作入队(enqueue),新元素始终被添加在队列的末尾. 删除(delete)操作也被称为出队(dequeue). 你只能移除第一个元素. 示例 - 队列 入队:您可以单击下面的 Enqueue 以查看如何将新元素 6 添加到队列中. ? Enqueue 出队:您可以单击下面的 Dequeue 以查看将删除哪个元素. Dequeue

模板 - 数据结构 - 单调队列/单调栈

一道例题,给定一串数字,求每连续k个数字的最大.最小值. 思路:初始化一个初始长度为k的单调队列,按从左到右加入元素,同时满足这个队列中的元素是递减的(也就是假如某个数被两个距离不超过k的大于他的数夹着,他会被从队尾调出队列).得到最大值. 向右移动一格,假如队首离开范围,出队.往队尾加入元素前,把队尾的所有比它小的元素全部出队. 得到新的最大值. #include<bits/stdc++.h> using namespace std; struct Monotone_Queue{ deque

数据结构。队列。栈。hashcode

Java数据结构和算法之栈与队列

二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表. 栈的修改是按后进先出的原则进行. 每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除. 图1 [示例]元素是以a1,a2,-,a

算法系列(六)数据结构之表队列和栈

在http://blog.csdn.net/robertcpp/article/details/51559333一文中,我们讲了排序,这一章来介绍一下基本数据结构:表.队列.栈和它们的简单实现 一.表ADT 1.数组实现顺序表 通过对数组操作,来直接对表进行增删查改操作,这种线性表查找某个位置的元素花费的时间为O(1),但是插入删除元素花费的时间为O(n),如果对表的操作更多的是访问操作,那么选择这种实现更为合适. 下面是一个简单实现 package com.algorithm.list; im

数据结构与算法之队列、栈

除了数组.链表,线性的数据结构中还有很重要的几种结构:队列.栈. 队列,一种先进先出的数据结构(FIFO),其实队列可以看成是一个两个口的管道,从一个口进,另一个口出,先进去的必定得在另一个口先出去,否则后面的都出不去:栈,一种后进先出的数据结构(LIFO),栈更像是只有一个口的管道,只有一个开口可以进出,先进去的在底部,所以必须得让后进去的先出去,它才能出去. 实现队列和栈可以用顺序存储结构,也可以用链式存储结构.这里采用的是链表来实现,同时还有用两个栈实现一个队列和用两个队列实现一个栈的算法