数据结构之栈和队列---c++

这篇具有很好参考价值的文章主要介绍了数据结构之栈和队列---c++。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

栈和队列的简单介绍

栈是一个“先进后出”结构
数据结构之栈和队列---c++,数据结构,c++,开发语言

队列

入队演示

队列是一种“先进先出”的结构
数据结构之栈和队列---c++,数据结构,c++,开发语言

出队演示

数据结构之栈和队列---c++,数据结构,c++,开发语言
接下来我们开始本次的内容

栈实现队列

数据结构之栈和队列---c++,数据结构,c++,开发语言

分析

1.我们可以老老实实的写一个栈然后将所有的接口函数实现出来,最后再进行实现队列,但是显然是效率低下的方法
2.我们使用数组模拟栈,然后再进行实现队列—可行
3.或者直接使用STL

算法演示

数据结构之栈和队列---c++,数据结构,c++,开发语言

开始实现

class MyQueue {
public:
		//我们不需要使用他的函数,因为我不想传参
		//定义两个stack一个是输入栈,一个是输出栈
        stack<int> pushst;
        stack<int> popst;
    MyQueue() {
    }
    
    //将元素输入到输入栈中
    void push(int x) {
        pushst.push(x);
    }
    
    int pop() {
        int res;//定义一个int型的值,用来接受返回值
         
         //pop的时候是从输出栈的栈顶出数据
         //如果输出栈为空,判断输入栈有没有数据,只有输入栈有数据的时候才能进行转移
         //只有输出栈有数据才能进行pop
 		//我们可以将顺序进行转换,但是需要进行重复的步骤
 		//也就是说,1.一开始popst没有元素为空,
 		//2.pushst有值,将pushst的元素转移到popst中,
 		//3.在进行popst不为空的判断进行pop那么
         //1.3步是相同的操作,如果将2换到最前面,后面只需要紧跟一个1步骤就能完成操作
        if(!popst.size()) 
        {
            while(pushst.size())
            {
                popst.push(pushst.top());
                pushst.pop();
            }
        }
        if(popst.size())
            res=popst.top(),popst.pop();
            return res;
    }
    
    //同上
    int peek() {
        int res;
         
        if(!popst.size()) 
        {
            while(pushst.size())
            {
                popst.push(pushst.top());
                pushst.pop();
            }
            
        }
        if(popst.size())
            res=popst.top();
            return res;
    }   
    
    //当pushst和popst同时没有值的时候->空
    bool empty() {
        if(pushst.size()||popst.size()) return false;
        return true;
    }
};

队列实现栈

算法演示

进栈

数据结构之栈和队列---c++,数据结构,c++,开发语言

出栈

数据结构之栈和队列---c++,数据结构,c++,开发语言

开始实现

c++中queue是双端队列,但是我们不适用这个特性,我们一点点的实现

class MyStack {
public:
	
    queue<int> q1,q2;
    MyStack() {

    }
     
    //使用假设的方式,定义空队列,进行判断是否与自己的假设相反,再空的队列中添加元素
    void push(int x) {
        queue<int>* em=&q1,*noem=&q2;
        if(!em->size()) noem=em,em=&q2;
        em->push(x);
    }
    
    //在pop的时候需要将不为空的队列找到,然后使队列中只剩一个元素,其余的元素全部移入另一个队列中,最后将这个元素记录并且删除
    int pop() {
        queue<int>* em=&q1,*noem=&q2;
        if(!noem->size()) em=noem,noem=&q1;
        while(noem->size()>1)
        {
            em->push(noem->front());
            noem->pop();
        }
        int res=0;
        if(noem->size()==1)
        {
            res=noem->front();
            noem->pop();
        }
        return res;
    }
    
    //同上
    int top() {
        queue<int>* em=&q1,*noem=&q2;
        if(!noem->size()) em=noem,noem=&q1;
        while(noem->size()>1)
        {
            em->push(noem->front());
            noem->pop();
        }
        int res=0;
        if(noem->size()==1)
        {
            res=noem->front();
            em->push(noem->front());
            noem->pop();

        }
        return res;
    }
    
    bool empty() {
        if(q1.size()||q2.size()) return false;
        return true;
    }
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack* obj = new MyStack();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->top();
 * bool param_4 = obj->empty();
 */

设计循环队列

数据结构之栈和队列---c++,数据结构,c++,开发语言

算法演示

数据结构之栈和队列---c++,数据结构,c++,开发语言文章来源地址https://www.toymoban.com/news/detail-631022.html

开始实现

//使用数组进行实现,结构体需要包含数组,实际使用的空间个数,头,尾
typedef struct {
    int* a;
    int k;
    int hh,tt;
} MyCircularQueue;

//当头和尾重合的时候就是空的时候
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    return obj->hh==obj->tt;
}

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return (obj->tt+1)%(obj->k+1)==obj->hh ;
}   
MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* queue=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    queue->a=(int*)malloc(sizeof(int)*(k+1));
    queue->k=k;
    queue->hh=queue->tt=0;
    return queue;
}
//对特殊情况进行判断,当tt位于最后一个的时候,需要将他从重新置为开头
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj)) return false;

    obj->a[obj->tt++]=value;
    obj->tt%=(obj->k+1);
    
    return true;
}
//对特殊情况进行判断,当hh位于最后一个的时候,需要将他从重新置为开头
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj)) return false;
    
    obj->hh++;
    obj->hh%=(obj->k+1);
    return true;
}   
//如果为空直接返回-1,不为空返回相应的值
int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj)) return -1;
    
    return obj->a[obj->hh];
}
//最后一个数据是在tt的前一个位置,同时当tt位于开头的时候需要找到最后的位置找值
int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj)) return -1;
    
    return obj->a[(obj->tt+obj->k)%(obj->k+1)];
}


void myCircularQueueFree(MyCircularQueue* obj) {
    free(obj->a);
    free(obj);
}

/**
 * Your MyCircularQueue struct will be instantiated and called as such:
 * MyCircularQueue* obj = myCircularQueueCreate(k);
 * bool param_1 = myCircularQueueEnQueue(obj, value);
 
 * bool param_2 = myCircularQueueDeQueue(obj);
 
 * int param_3 = myCircularQueueFront(obj);
 
 * int param_4 = myCircularQueueRear(obj);
 
 * bool param_5 = myCircularQueueIsEmpty(obj);
 
 * bool param_6 = myCircularQueueIsFull(obj);
 
 * myCircularQueueFree(obj);
*/

到了这里,关于数据结构之栈和队列---c++的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 高效学习数据结构之栈和队列篇(五千字超详细教程)

    高效学习数据结构之栈和队列篇(五千字超详细教程)

    大家好呀我是小生🙉🙊🙈今天我们来学习 数据结构的栈和队列 ,小生为了方便大家理解特意附上了 许多图片和源码 一起加油吧 🥳🥳🥳   下面是我们今天要学习的内容 🥳🥳🥳  一.栈          1.🏠栈的基本概念 ​2.🏠栈的结构选择 🚀顺序表和链表的优缺点对比:

    2023年04月08日
    浏览(13)
  • 数据结构之栈和队列 - 超详细的教程,手把手教你认识并运用栈和队列

    数据结构之栈和队列 - 超详细的教程,手把手教你认识并运用栈和队列

    栈:后进先出 队列:先进先出 栈:是一种特殊的 线性表 , 只允许在固定的一端插入或者删除元素 ,一个栈包含了栈顶和栈底。只能在栈顶插入或者删除元素。 栈的底层 是由 数组 实现的。 栈遵循先入后出原则,也就是先插入的元素得到后面才能删除,后面插入的元素比

    2024年02月07日
    浏览(45)
  • 《数据结构》之栈和堆结构及JVM简析

    《数据结构》之栈和堆结构及JVM简析

    在数据结构中,我们第一了解到了栈或堆栈,它的结构特点是什么呢?先进后出,它的特点有什么用呢?我们在哪里可以使用到栈结构,栈结构那么简单,使用这么久了为什么不用其它结构替代? 作为一个程序猿,我们应该会常常跟代码打交道,那么我们所编写的程序或代码

    2024年02月07日
    浏览(19)
  • 【C语言】数据结构——栈和队列实例探究

    【C语言】数据结构——栈和队列实例探究

    💗个人主页💗 ⭐个人专栏——数据结构学习⭐ 💫点击关注🤩一起学习C语言💯💫 我们在前面学习了单链表和顺序表,今天我们来学习栈和队列。 栈和队列相对于单链表和顺序表来说是较为简单的,之后我们再深入学习双链表。关注博主或是订阅专栏,掌握第一消息。 栈

    2024年02月05日
    浏览(12)
  • 数据结构初阶(用C语言实现简单数据结构)--栈和队列

    数据结构初阶(用C语言实现简单数据结构)--栈和队列

    ✨✨欢迎来到T_X_Parallel的博客!!       🛰️博客主页:T_X_Parallel       🛰️专栏 : 数据结构初阶       🛰️欢迎关注:👍点赞🙌收藏✍️留言 这小猫真好看 言归正传,通过上篇有关顺序表和链表的博客,可以了解到线性表的一些大致特征,这篇博

    2024年02月08日
    浏览(11)
  • 数据结构入门(C语言版)栈和队列之队列的介绍及实现

    数据结构入门(C语言版)栈和队列之队列的介绍及实现

    什么是队列呢?我们先看下面的图: 我们可以理解成高速公路上的隧道,根据这个图的描述 我们把需入队的元素看作一辆车,把队列看作隧道,由此我们可以看出 队列的特点是 只允许从一端进入,从另一端离开。 队列就是只允许在一端进行插入数据操作,在另一端进行删

    2023年04月15日
    浏览(10)
  • 【数据结构】—手把手带你用C语言实现栈和队列(超详细!)

    【数据结构】—手把手带你用C语言实现栈和队列(超详细!)

                                       食用指南:本文在有C基础的情况下食用更佳                                     🔥 这就不得不推荐此专栏了:C语言                                   ♈️ 今日夜电波:Tell me —milet                    

    2024年02月14日
    浏览(250)
  • 【数据结构】线性表之栈、队列

    【数据结构】线性表之栈、队列

    前面两篇文章讲述了关于线性表中的顺序表与链表,这篇文章继续讲述线性表中的 栈和队列。 这里讲述的两种线性表与前面的线性表不同,只允许在一端入数据,一段出数据,详细内容请看下面的文章。 顺序表与链表两篇文章的链接: 线性表之顺序表 线性表之链表 注意:

    2024年02月06日
    浏览(47)
  • 数据结构(C语言实现)——栈和队列的介绍及基本操作的实现(动态顺序栈+链队)

    今天我们来学习另外两个线性结构——栈和队列,栈和队列是操作受限的线性表,因此,可称为限定性的数据结构。 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守

    2023年04月19日
    浏览(14)
  • 数据结构之栈、队列——算法与数据结构入门笔记(四)

    数据结构之栈、队列——算法与数据结构入门笔记(四)

    本文是算法与数据结构的学习笔记第四篇,将持续更新,欢迎小伙伴们阅读学习 。有不懂的或错误的地方,欢迎交流 栈是一种线性数据结构,其 只允许在固定的一端进行插入和删除 元素操作。进行数据插入和删除操作的一端称为栈顶 (Top), 另一端称为栈底 (Bottom)。栈中的

    2024年02月08日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包