JZ9 用两个栈实现队列

描述

用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能。
队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。
 
数据范围: n1000
要求:存储n个元素的空间复杂度为 O(n),插入与删除的时间复杂度都是 O(1)

示例1

输入:
["PSH1","PSH2","POP","POP"]
返回值:
1,2
说明:
"PSH1":代表将1插入队列尾部
"PSH2":代表将2插入队列尾部
"POP“:代表删除一个元素,先进先出=>返回1
"POP“:代表删除一个元素,先进先出=>返回2

示例2

输入:
["PSH2","POP","PSH1","POP"]
返回值:
2,1


解题思路:

通常情况:数据按顺序存在栈s1中,栈s2为空

 

 压栈时(PUSH):直接压入栈s1

 

 出栈时(POP):将栈s1的元素全部压入栈s2中,弹出s2栈顶的元素

 

 *本次实现时:在出栈(POP)结束后,不再将栈s2中的数据放回栈s1中;因此需要在入栈(PUSH)前判断s2是否有元素需要转移到s1

*注:有元素在栈中时,两个栈s1、s2只有两种状态s1有元素+s2空、s2有元素+s1空

入栈(PUSH):若s2为空栈,则新元素直接压入s1;若s2不为空,则需要先将s2中数据压入s1中。

出栈(POP):若s1为空栈,则直接弹出s2顶部元素;若s1不为空,则需要先将s1中所有元素压入栈s2中,再弹出顶部元素。

 

C语言实现:

复制代码
 1 /**
 2  * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 3  *
 4  * 
 5  * @param node int整型 
 6  * @return 无
 7  *
 8  * C语言声明定义全局变量请加上static,防止重复定义
 9  *
10  * C语言声明定义全局变量请加上static,防止重复定义
11  */
12 #define MAXSIZE 1001
13 /* 实现方法:栈的顺序存储 */
14 typedef struct{
15     int data[MAXSIZE];
16     int top;
17 } Stack; 
18 
19 static Stack s1 = { .top = -1};    //First stack
20 static Stack s2 = { .top = -1};    //Second stack
21 
22 void push(int node ) {
23     // write code here
24     //case 1: s1 is empty, check s2
25     if(s1.top == -1){
26         while(s2.top >= 0){
27             s1.data[++(s1.top)] = s2.data[(s2.top)--];
28         }
29     }
30     //case 2: s2 is empty(do nothing)
31     
32     s1.data[++(s1.top)] = node;
33 }
34 
35 /**
36  * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
37  *
38  * 
39  * @param 无 
40  * @return int整型
41  */
42 int pop() {
43     // write code here
44     //case 1: s2 is empty
45     if(s2.top == -1){
46         while(s1.top >= 0){
47             s2.data[++(s2.top)] = s1.data[(s1.top)--];
48         }
49     }
50     //case 2: s1 is empty (do nothing)
51     
52     return s2.data[(s2.top)--];
53 }
复制代码

 

 

 

 

 

 

 

 

posted @   zenyi  阅读(86)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示