首页 > 其他分享 >利用两个栈实现队列结构——“先进先出”

利用两个栈实现队列结构——“先进先出”

时间:2024-05-04 22:33:19浏览次数:23  
标签:出栈 temp 队列 s2 s1 元素 利用 int 先进先出

请利用两个找sl 和s2 来模拟一个队列, 假设栈中元素为int 型, 栈中元素最多为maxSize 。已知栈的3 个运算定义如下。

push(ST,x) : 元素x 入ST 栈。
pop(ST,&x): ST 栈顶元素出栈, 赋给变量x 。
isEmpty(ST) : 判断ST 栈是否为空。
如何利用栈的运算来实现该队列的3 个运算: enQueue (元素入队列)、deQu eue (元素出队列)、
isQueueEmpty (判断队列是否为空, 空返回1' 不空返回0 ) 。要求:
( 1 ) 给出基本设计思想。
( 2 ) 根据设计思想, 采用C 或C++语言描述算法, 关键之处给出注释。

/**
 * file name:StackQueue.c
 * author   : liaojx2016@126.com
 * date     : 2024-04-28
 * function : Implementing queues using two stacks s1 and s2
 * note     : None
 * CopyRight (c)   2024  liaojx2016@126.com  Right Reseverd
 *
**/
//栈的思想是“后进先出”,队列的思想是“先进先出”.
//把栈s1作为入队缓存,把栈s2作为出队缓存

#include <stdio.h>
#include <stdlib.h>
// #include <cstddef>
#include <stdbool.h>

#define MAXSIZE 20
typedef struct 
{
  int data [MAXSIZE];//存放栈中元素
  int top;//栈顶指针
}SeqStack;


/**
 *
 * func name      : EnQueue
 * function       : Enqueue
 * parameter      : 
 *                      @s1:stack pointer
 *                      @s2:stack pointer
 *                      @x :enqueue value
 *
 * Return val      : none
 * note            : None
 * author          : liaojx2016@126.com
 * date            : 2024-04-26
 * version         : V1.0
 * modify history  : None
 *
**/
//入队
int EnQueue(s1, s2, int x)
{
	int temp; //用于存储出栈的元素的值

	//1.判断栈s1是否已满
	if (s1->top + 1 >= MAXSIZE)
	{
		//说明栈s1已满,再s2满或者空
		if ( isEmpty(s2) )
		{
      return 0;//如果是s1满而s2不空就无法入栈
    }
			//此时栈s2为空,所以需要把栈s1的元素依次出栈到s2中
      else if (isEmpty(s2)){
			while( ! isEmpty(s1) )
			{
				pop(s1,&temp); //把出栈元素暂时存储在temp中
				push(s2,temp); //把变量temp中的元素入栈到s2
			}

			push(s1,x); //将s1中所有元素都压入s2中,又可以把新元素x入栈到s1
			return 1;
		}

	else
	{
		//此时栈s1未满,所以可以把元素x入栈到s1中
		push(s1,x); 
    return 1;
	}
}

/**
 *
 * func name      : isQueueEmpty
 * function       : Judge whether queue is empty
 * parameter      : 
 *                      @s1:stack pointer
 *                      @s2:stack pointer
 * Return val      : Judge result (1 means the queue is empty,0 means the queue is not empty)
 * note            : None
 * author          : liaojx2016@126.com
 * date            : 2024-04-26
 * version         : V1.0
 * modify history  : None
 *
**/
//判断队列为空
int isQueueEmpty(s1,s2)
{
	if (isEmpty(s1) && isEmpty(s2))
	{
		return 1;
	}
	else
		return 0;
}

/**
 *
 * func name      : DeQueue
 * function       : Dequeue
 * parameter      : 
 *                      @s1:stack pointer
 *                      @s2:stack pointer
 * 						@x :dequeue value
 * Return val      : Judge result (1 means the dequeue success, 0 means the dequeue fail)
 * note            : None
 * author          : liaojx2016@126.com
 * date            : 2024-04-26
 * version         : V1.0
 * modify history  : None
 *
**/
//出队
int DeQueue(s1,s2,&x)
{
	int temp; //为了存储出栈的元素

	//1.判断队列是否为空
	if (isQueueEmpty(s1,s2))
	{
		printf("the queue is empty,dequeue failed\n");
		return 0;
	}
	else
	{
		//说明队列不空,判断栈s2空或栈s2不空
		if ( !isEmpty(s2) )
		{
			//说明栈s2不空,则直接把元素出栈
			pop(s2,&x);
		}
		else
		{
			//说明栈s2为空,此时需要把栈s1的元素依次出栈到s2中
			while( ! isEmpty(s1) )
			{
				pop(s1,&temp); //把出栈元素暂时存储在temp中
				push(s2,temp); //把变量temp中的元素入栈到s2
			}

			pop(s2,&x);
		}
	}

	return 1;
}

标签:出栈,temp,队列,s2,s1,元素,利用,int,先进先出
From: https://www.cnblogs.com/JinBool/p/18172862

相关文章

  • 代码随想录算法训练营第11天 | 栈与队列 20.有效的括号 1047.删除字符串中的所有相邻
    leetcode20.有效的括号题目20.有效的括号给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。解题思路实现代码leetcod......
  • 5月3日模拟赛题解(李时珍的皮肤衣 , 马大嘴的废话 , SSY的队列 , 清理牛棚 , 历史の研究)
    T1李时珍的皮肤衣发现是二进制进位,所以直接快速幂即可。#include<bits/stdc++.h>#defineint__int128inlineintread(){charch=getchar();intx=0,f=1;for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;for(;ch>='0'......
  • 题解:ssy的队列
    题目链接题目描述SSY是班集体育委员,总喜欢把班级同学排成各种奇怪的队形,现在班级里有\(N\)个身高互不相同的同学,请你求出这\(N\)个人的所有排列中任意两个相邻同学的身高差均不为给定整数\(M\)的倍数的排列总数。输入格式共三行:第一行为\(N\)第二行为\(N\)个不同的......
  • 考研打卡链表,栈,队列
    1:链表点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedefstructnode{ intdata; structnode*next;}listnode,*list1;typedefstructnow{ intdata; structnow*next,*prve;}listnow,*list2;boollistn(list1&L,intx,inty){ if(x&l......
  • 代码随想录算法训练营第10天 | 栈和队列 232.用栈实现队列 225.用队列实现栈
    leetcode232.用栈实现队列题目232.用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:voidpush(intx)将元素x推到队列的末尾intpop()从队列的开头移除并返回元素intpeek()返回队列开头的......
  • CPU利用率100%怎么处理?
    --查看内核节拍率[root@p4-oadmnewdb01~]#grep'CONFIG_HZ='/boot/config-4.19.90-23.32.v2101.ky10.x86_64CONFIG_HZ=250--查看不同场景的CPU时间cat/proc/stat|grep^cpu[root@p4-oadmnewdb01~]#cat/proc/stat|grep^cpucpu1597988157210022139005384242060......
  • Redis 缓存/分布式锁/消息队列的应用
    缓存缓存是最常见的的应用类型,因为同等配置下,如果一台MySQL能支持上千的QPS,那么一台redis支持的QPS能达到上万,十倍于MySQL。客户端将热点数据存储在redis中,优先从redis读取数据,可以减轻数据库的访问压力。但将redis作为缓存,也存在一些问题,例如数据不一致。数据不一致场景:redis......
  • 利用PLC扫描周期实现一些小技巧
    上升沿//pulsegenerateIF#my_singalANDNOT#pulse_boolTHEN;END_IF;#pulse_bool:=#my_singal;数值记忆,记录当数值变化时事件//memory,my_order由外部主动触发IF#my_order<>#memory_orderTHEN;END_IF;#memory_order:=#my_order;清数据之......
  • 技术探秘:如何利用仪表构造InfiniBand流量在数据中心测试中的应用
    一、什么是Infiniband?在当今数据爆炸的时代,数据中心作为信息处理的中心枢纽,面临着前所未有的挑战。传统的通信方式已经难以满足日益增长的数据传输需求,而InfiniBand技术的出现,为数据中心带来了全新的通信解决方案。InfiniBand(IB)是一种高性能计算和数据中心网络架构,其设计目标是......
  • 利用二分法删除数组中元素
    二分法的思想主要是要设定起始值和终点值,计算中值,和给定值进行比较,如果大于给定值,则将中值作为终点值,否则作为起始值,重新计算中值。#include<stdio.h>intmain(){intarray[10]={1,2,3,5,8,15,20,30,100,200};intfirst=0,end=9,middle=(first+end)/2,num,i;s......