網站首頁 編程語言 正文
目錄
大體思路:
代碼實現:
運行結果:
棧和隊列的問題在面試中經常會被問到,本篇文章教大家如何用兩個對列模擬一個棧出來。
先來講一下棧和隊列的基本特點
棧:先進后出,只能在棧頂進行操作。
如:向棧內輸入1,2,3,4,5,那么輸出則為5,4,3,2,1。就好像一個電梯,先進去的人后出來,進和出都是在末尾操作。
隊列:先進先出,隊尾插入,隊頭刪除。
如:向隊內輸入1,2,3,4,5,那么輸出也為1,2,3,4,5。把入棧出棧比做出入電梯的話,入隊出隊更像是在排隊,來的晚的人只能排在隊伍的末尾。
大體思路:
第一步:定義兩個隊列,隊列1和隊列2。
讓所有數據入隊列1,這里舉例為1,2,3,4,5。
此時隊列1的內容為1,2,3,4,5,隊列2為空。
第二步:讓數據出隊列1,入隊列2,使隊列1只留下一個數據。
此時隊列1的內容為5,隊列2的內容為1,2,3,4
然后讓隊列1的內容出隊并打印,此時隊列1為空。
第三步:讓數據出隊列2,入隊列1,使隊列2只留下一個數據
此時隊列1的內容為1,2,3,隊列2的內容為4
然后讓隊列2的內容出隊并打印。此時隊列2為空
第四步:循環步驟2和步驟3,直至兩個隊列都為空
代碼實現:
#include <stdio.h>
#define N 6
typedef struct queue//定義一個隊列
{
int front;//隊頭下標
int arr[N];
int rear;//隊尾下標
}Queue;
int main()
{
Queue queue1,queue2;//定義隊列1和隊列2
queue1.front=N-1;//初始化隊列1的隊頭下標
queue1.rear=N-1;//初始化隊列1的隊尾下標
queue2.front=N-1;//初始化隊列2的對頭下標
queue2.rear=N-1;//初始化隊列2的隊尾下標
//rear==front時隊列為空
//1.將數據入隊列1
printf("請輸入%d個數字\n",N-1);//循環隊列需要空出一個元素的位置
while(1)
{
queue1.rear=(queue1.rear+1)%N;
scanf("%d",&queue1.arr[queue1.rear]);
if((queue1.rear+1)%N==queue1.front)//隊列為滿停止入隊
break;
}
//4.循環步驟2,步驟3,直至兩個隊列都為空
while(1)
{
//在兩個循環前都加一個判斷,兩個隊列都為空時就跳出循環
if(queue1.front==queue1.rear&&queue2.front==queue2.rear)
break;
//2.讓數據從隊列1出隊,入隊列2,使隊列1只留下一個數據
while(1)
{
if((queue1.front+1)%N==queue1.rear)//此時隊列1中只剩一個數據
{
queue1.front=(queue1.front+1)%N;//讓隊列1最后的那個數據出隊
printf("%d ",queue1.arr[queue1.front]);
break;
}
queue1.front=(queue1.front+1)%N;
queue2.rear=(queue2.rear+1)%N;
queue2.arr[queue2.rear]=queue1.arr[queue1.front];//隊列1出隊入隊列2
}
//此時隊列2的內容為1,2,3,4,隊列1為空
//在兩個循環前都加一個判斷,兩個隊列都為空時就跳出循環
if(queue1.front==queue1.rear&&queue2.front==queue2.rear)
break;
//3.讓數據從隊列2出隊,入隊列1,使隊列2只留下一個數據
while(1)
{
if((queue2.front+1)%N==queue2.rear)//此時隊列2中只剩一個數據
{
queue2.front=(queue2.front+1)%N;//讓隊列2中最后的那個數據出隊
printf("%d ",queue2.arr[queue2.front]);
break;
}
queue2.front=(queue2.front+1)%N;
queue1.rear=(queue1.rear+1)%N;
queue1.arr[queue1.rear]=queue2.arr[queue2.front];
}
//此時隊列1的內容為1,2,3,隊列2為空
}
printf("\n");
return 0;
}
運行結果:
實現的方式可能有很多,這里只寫了一個,如果文章有表述不清楚的地方歡迎大家指正
?
原文鏈接:https://blog.csdn.net/m0_72772587/article/details/126561441
相關推薦
- 2022-11-03 C++高精度算法的使用場景詳解_C 語言
- 2022-12-26 C++內存分區模型超詳細講解_C 語言
- 2022-03-13 C語言實現求解最小公倍數的算法示例_C 語言
- 2023-03-04 Go語言實現分布式鎖_Golang
- 2021-12-23 使用go?net實現簡單的redis通信協議_Golang
- 2022-06-29 C語言實例講解選擇語句的使用_C 語言
- 2022-10-13 詳解python-opencv?常用函數_python
- 2022-08-06 使用Gorm操作Oracle數據庫踩坑記錄_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支