Leetcode225. 用队列实现栈

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

1.题目描述

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty()
    如果栈是空的,返回 true ;
    否则,返回 false 。

2.原题链接

Leetcode225. 用队列实现栈

3.思路分析

1 . 这道题利用队列先进先出的特性来实现栈 ,使用用两个队列
2. 保证一个队列为空 ,另一个队列存放size个数据 ,
如何实现栈的Pop?
将有数据的队列中的size-1个数据放进另一个空队列 ,然后将剩下的数据Pop,那就有一个问题,如何判断哪个队列为空?
定义两个变量 , emptyQ (空队列 ) , nonemptyQ( 不是空队列) 。假设q1 为空队列, q2 不为空队列 ( q1 ,q2 为两个队列 )。如果q1为空队列, q2 不为空队列,则假设成功 , 如果q1不为空队列, q2 为空队列,则假设失败 ,就将q2变为空队列 , q1 变为非空队列
如何实现栈的Push ?
如果 有队列不为空 ,就往该队列插入数据 , 哪个队列不为空 ,就往哪个队列插入
如何实现栈的Empty ?
两个队列为空即栈为空

4.代码实现

这道题使用的结构体比较多 ,我们画图辅助理解相应的细节 : 图中的QNode* head 、QNodetail , 分别对应下面代码中的 Queue head 、Queue* tail

Leetcode225. 用队列实现栈

typedef int   QueueNodeTypeData;

typedef struct  QueueNode
{
	struct  QueueNode* next;
	QueueNodeTypeData data;
}QueueNodeType;

typedef struct Queue
{
	QueueNodeType * tail; // 队尾
	QueueNodeType * head; //队头
	int size; 
} Queue;  // 链式结构:表示队列


void QueueInit(Queue* pq);  // 初始化  

void QueueDestory(Queue* pq); //队列的销毁

void QueuePush(Queue* pq , QueueNodeTypeData x );  // 队尾入队列

void QueuePop(Queue* pq); //队头出队列

int QueueSize(Queue* pq);//获取队列中有效元素个数

bool QueueEmpty(Queue* pq); // 判断队列是否为空 

QueueNodeTypeData QueueFront(Queue * pq); //获取队列头部元素

QueueNodeTypeData QueueBack(Queue * pq); //获取队列尾部元素


void QueueInit(Queue* pq)
{
	assert(pq);
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

void QueueDestory(Queue* pq) //队列的销毁
{
	assert(pq);
	QueueNodeType * cur = pq->head;
	
	//遍历 
	while (cur)
	{
		QueueNodeType* next = cur->next;  //保存下一个节点的地址
		free(cur); //释放当前节点
		cur = next; 
	}
	  pq->tail = pq->head = NULL;
	pq->size = 0;
}
void QueuePush(Queue* pq, QueueNodeTypeData x) // 入队 
{
	assert(pq);
	QueueNodeType* newnode =(QueueNodeType*) malloc( sizeof(QueueNodeType) );
	if (newnode == NULL)
	{
		printf(" malloc fail");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;
	//扩容成功

	//第一次入队
	if ( pq->head == NULL)
	{
   		assert(pq->tail == NULL);   //pq->head ==NULL , pq->tail != NULL ,就是出问题了
		pq->tail = pq->head = newnode;
	}
	else //非第一次入队
	{
		pq->tail->next = newnode; // 类似尾插
		pq->tail = newnode; // 更新tail 指针
	}
	pq->size++;
}
void QueuePop(Queue* pq) //队头出队列
{
	assert(pq);
	assert(pq->head != NULL); 

	//只有一个节点

	if (pq->head->next == NULL) 
	{
		free(pq->tail);  //出队
		pq->tail = pq->head = NULL;
	}
	// 多个节点
	else
	{
		QueueNodeType* next = pq->head->next; // 保存下一个节点的地址 
		free(pq->head); // 出队
		pq->head = NULL;
		pq->head = next;  //更新pq->head ,往后走 
	}
	pq->size--;
}


int QueueSize(Queue* pq)//获取队列中有效元素个数
{
	assert(pq);
	
	return pq->size;
}


bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return  pq->head == NULL ;
}

QueueNodeTypeData QueueFront(Queue* pq) //获取队列头部元素
{
	assert(pq);
	assert(!QueueEmpty(pq)); //防止队列为空
	
	return pq->head->data;

}

QueueNodeTypeData QueueBack(Queue* pq) //获取队列尾部元素
{
	assert(pq);
	assert(!QueueEmpty(pq)); //防止队列为空

	return pq->tail->data;
}









typedef struct
 {
   Queue q1 ;
   Queue q2 ;



} MyStack;


MyStack* myStackCreate() 
{
   MyStack * pst = (MyStack *)malloc ( sizeof( MyStack));      
   if( pst == NULL)
   {
     perror( "malloc fail");
     return NULL ;
   } 
    //初始化两个队列 
    QueueInit(&pst->q1);
    QueueInit(&pst->q2);
  return pst ;
}

void myStackPush(MyStack* obj, int x) 
{
    //q1 不为空 ,插入数据 
    if( !QueueEmpty(&obj->q1))
    {
      QueuePush( &obj->q1 ,x);
    }
    else //q2 不为空 ,插入数据 
    {
         QueuePush( &obj->q2 ,x);
    }
}

int myStackPop(MyStack* obj) 
{
       //假设q1 不为空队列 ,q2 为空队列 
   MyStack* empty = &obj->q2;
   MyStack* nonempty = &obj->q1;

   if( !QueueEmpty(&obj->q2))  // q2 不为空队列 ,q1 为空队列 ,假设失败,重新假设即可 
   {
      empty = &obj->q1 ;
      nonempty = &obj->q2 ;
   }

    //将有数据的队列中的size-1个数据放进另一个空队列  
    while ( QueueSize(nonempty)>1)
    {
          QueuePush( empty , QueueFront(nonempty));
           QueuePop(nonempty);
    }   
   //Pop将剩下的一个数据
   int top  = QueueBack(nonempty);
  QueuePop(nonempty);
  return top ;
   

}

int myStackTop(MyStack* obj)  //返回栈顶元素 
 {
    //q1 为空 返回 q2的队尾元素 
    if( !QueueEmpty(&obj->q2))
    {
        return QueueBack(&obj->q2) ;
    }
    else  //q2 为空 返回 q1的队尾元素 
    {
        return QueueBack(&obj->q1) ;
  
    }
 }

bool myStackEmpty(MyStack* obj) 
{ 
   return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2) ;  
}

void myStackFree(MyStack* obj)
 {
     QueueDestory( &obj->q1);
     QueueDestory( &obj->q2);
     free( obj);
   
}

Leetcode225. 用队列实现栈
如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注
你们的每一次支持都将转化为我前进的动力!!
文章来源地址https://www.toymoban.com/news/detail-418808.html

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

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

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

相关文章

  • 算法训练day9Leetcode232用栈实现队列225用队列实现栈

    https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 见我的博客 https://blog.csdn.net/qq_36372352/article/details/135470438?spm=1001.2014.3001.5501 在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些, 输出栈如果为空,就把进栈数据全部导

    2024年01月24日
    浏览(64)
  • 225. 用队列实现栈

    请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。 int pop() 移除并返回栈顶元素。 int top() 返回栈顶元素。 boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

    2024年02月10日
    浏览(27)
  • 算法第10天|232.用栈实现队列225. 用队列实现栈

    力扣链接 题目描述: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作( push 、 pop 、 peek 、 empty ): 实现  MyQueue  类: void push(int x)  将元素 x 推到队列的末尾 int pop()  从队列的开头移除并返回元素 int peek()  返回队列开头的元素 boolean empty(

    2024年02月22日
    浏览(38)
  • 第10天-代码随想录刷题训练-第五章 栈和队列- ● 理论基础 ● 232.用栈实现队列 ● 225. 用队列实现栈

    栈和队列对应的三个不同的STL版本,底层实现方式不一样, 为我们所知道的是 SGI STL 栈 栈提供 pop和push等接口, 不提供走访功能 也不提供迭代器, 不像map和set可以使用迭代器遍历,往往不被归类为容器,而是容器适配器 栈的内部实现结构可以使用 verctor、list 和 deque(默认)

    2024年02月04日
    浏览(41)
  • 【leetcode】学了栈和队列却觉得无用武之地?试试这几道题目吧!

      目录 0.写在前面 1.leetcode.20 有效的括号 2.leetcode.225 用队列实现栈 3.用栈实现队列 4.设计循环队列 这些题目所用语言为C语言,由于C语言未提供栈和队列的数据结构,所以需要我们手动实现栈和队列。此外熟练掌握栈和队列的性质对解题尤为重要。如果忘记了栈和队列的使用

    2024年01月20日
    浏览(22)
  • 【LeetCode】1000题挑战(225/1000)

    目录 1000题挑战 没有废话,直接开刷! 第一题:202. 快乐数 - 力扣(Leetcode) 题目接口: 解题思路: 代码: 过过过过啦!!!! 第二题:205. 同构字符串 - 力扣(Leetcode) 题目接口: 解题思路: 代码: 过过过过啦!!!! 第三题:219. 存在重复元素 II - 力扣(Leetcode) 题

    2024年02月02日
    浏览(33)
  • 【数据结构经典题目】—两个队列实现栈与两个栈实现队列

    ​                                           食用指南:本文在有C基础的情况下食用更佳                                            🔥 这就不得不推荐此专栏了: C语言                                         🍀

    2024年02月13日
    浏览(46)
  • 1109 Group Photo(40行代码+超详细注释+题目分析,双端队列实现)

    分数 25 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 Formation is very important when taking a group photo. Given the rules of forming K rows with N people as the following: The number of people in each row must be N/K (round down to the nearest integer), with all the extra people (if any) standing in the last row; All the

    2024年02月07日
    浏览(111)
  • 【leetcode】232. 用栈实现队列

    1.使用两个栈结构构建队列 我们需要自定义栈及其相关操作 栈结构遵循后入先出的原则,队列结构遵循先入先出的原则 构建具有两个栈结构的队列,栈pushST用于数据的插入,栈popST用于数据的删除 为栈结构动态开辟空间并初始化栈结构 2.入队操作 模拟入队操作,即将所有元

    2024年02月12日
    浏览(43)
  • leetcode 232.用栈实现队列

    🌟 leetcode链接:用栈实现队列 1️⃣ 思路和图解: push: pop: peek: 和 pop 类似。 代码: ✨ 栈和队列相关接口代码(可复制): 【数据结构】栈和队列

    2024年02月13日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包