JZ9 用两个栈实现队列
描述
用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能。
队列中的元素为int类型。保证操作合法,即保证pop操作时队列内已有元素。
数据范围: n≤1000
要求:存储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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端