利用棧實現佇列(C語言實現)
在上一篇優化後佇列的實現(C語言實現) 中,雖然我們對佇列的時間複雜度進行了優化,但是卻讓程式碼的可讀性變差了,程式碼顯得略微臃腫(當然,這些話你看看就好,主要是為了奉承這篇博文的)。
這裡主要實現的是:利用棧來實現佇列
基本思路:
1,建立兩個棧
2,兩個棧合併起來組裝成一個佇列,分別取名為instack,outstack,用於進佇列,出佇列
3,比如有1,2,3,4,5 需要進入佇列,先將這一串數壓入instack棧中,假設壓入順序為1,2,3,4,5(1為棧底),再將instack中的資料移入outstack中,出棧順序為:5,4,3,2,1. 那麼入outsatck的時候,進棧的順序同樣為 : 5,4,3,2,1(5為棧底),那麼出outstack的時候,順序即為:1,2,3,4,5 這樣就做到了入是1,2,3,4,5 出也是1,2,3,4,5 這樣就跟佇列是一樣一樣的了。
程式碼實現思路:
實現思路
準備兩個棧用於實現佇列:inStack和outStack
當有新元素入隊時: :將其壓入 將其壓入inStack中
當需要出隊時:
當outStack為空時:
1. 將inStack中的元素逐一彈出並壓入outStack中
2. 將outStack的棧頂元素彈出
當outStack不為空時:
– 直接將outStack的棧頂元素彈出
原始碼入下:
這裡用到了棧的程式碼,具體可以參閱:棧的實現與操作(C語言實現)
標頭檔案:
#ifndef _SPQueue_H_
#define _SPQueue_H_
typedef void SPQueue;
SPQueue* SPQueue_Create();
void SPQueue_Destroy(SPQueue* queue);
void SPQueue_Clear(SPQueue* queue);
int SPQueue_Append(SPQueue* queue, void* item);
void* SPQueue_Retrieve(SPQueue* queue);
void* SPQueue_Header(SPQueue* queue);
int SPQueue_Length(SPQueue* queue);
#endif
原始檔:
// 棧實現佇列.cpp : 定義控制檯應用程式的入口點。
//
#include "stdafx.h"
#include "SPQueue.h"
#include "LinkStack.h"
#include <malloc.h>
#include <stdlib.h>
typedef struct
{
LinkStack * instack;
LinkStack * outstack;
} TSPQueue;
int _tmain(int argc, _TCHAR* argv[])
{
SPQueue* queue = SPQueue_Create();
int a[10] = {0};
int i = 0;
for(i=0; i<10; i++)
{
a[i] = i + 1;
SPQueue_Append(queue, a + i);
}
printf("第一次進佇列:");
printf("Header: %d\n", *(int*)SPQueue_Header(queue));
printf("Length: %d\n", SPQueue_Length(queue));
for(i=0; i<5; i++)
{
printf("%d\t出佇列了\n", *(int*)SPQueue_Retrieve(queue));
}
printf("\n第二次進佇列:\n");
printf("Header: %d\n", *(int*)SPQueue_Header(queue));
printf("Length: %d\n", SPQueue_Length(queue));
for(i=0; i<10; i++) //繼續尾加10個節點
{
a[i] = i + 1;
SPQueue_Append(queue, a + i);
}
while( SPQueue_Length(queue) > 0 )
{
printf("%d\t出佇列了\n", *(int*)SPQueue_Retrieve(queue));
}
SPQueue_Destroy(queue);
system("pause");
return 0;
}
//建立
SPQueue* SPQueue_Create()
{
TSPQueue* ret = (TSPQueue*)malloc(sizeof(TSPQueue));
if (NULL != ret)
{
ret->instack = LinkStack_Create();
ret->outstack = LinkStack_Create();
if ((NULL == ret->instack) && (NULL == ret->outstack))
{
LinkStack_Destroy(ret->instack);
LinkStack_Destroy(ret->outstack);
free(ret);
ret = NULL;
}
}
return ret;
}
//銷燬
void SPQueue_Destroy(SPQueue* queue)
{
SPQueue_Clear(queue);
free(queue);
}
//清空
void SPQueue_Clear(SPQueue* queue)
{
TSPQueue* SPQueue = (TSPQueue*)queue;
if (NULL != SPQueue)
{
LinkStack_Clear(SPQueue->instack);
LinkStack_Clear(SPQueue->outstack);
}
}
//尾加
int SPQueue_Append(SPQueue* queue, void* item)
{
TSPQueue* SPQueue = (TSPQueue*)queue;
int ret = 0;
if (NULL != SPQueue)
{
ret = LinkStack_Push(SPQueue->instack,item);
}
return ret;
}
//刪除頭部
void* SPQueue_Retrieve(SPQueue* queue)
{
TSPQueue* SPQueue = (TSPQueue*)queue;
void * ret = NULL;
if (NULL != SPQueue)
{
//當outstack長度為0時,把instack中的資料移入outstack
if (LinkStack_Size(SPQueue->outstack) == 0)
{
while (LinkStack_Size(SPQueue->instack) > 0)
{
LinkStack_Push(SPQueue->outstack,LinkStack_Pop(SPQueue->instack));
}
}
//取出outstack的棧頂
ret = LinkStack_Pop(SPQueue->outstack);
}
return ret ;
}
//獲得頭部
void* SPQueue_Header(SPQueue* queue)
{
TSPQueue* SPQueue = (TSPQueue*)queue;
void * ret = NULL;
if (NULL != SPQueue)
{
if (LinkStack_Size(SPQueue->outstack) == 0)
{
while (LinkStack_Size(SPQueue->instack) > 0)
{
LinkStack_Push(SPQueue->outstack,LinkStack_Pop(SPQueue->instack));
}
}
ret = LinkStack_Top(SPQueue->outstack);
}
return ret ;
}
//長度
int SPQueue_Length(SPQueue* queue)
{
TSPQueue* SPQueue = (TSPQueue*)queue;
int ret = 0;
if (NULL != SPQueue)
{
ret = LinkStack_Size(SPQueue->instack) + LinkStack_Size(SPQueue->outstack);
}
return ret;
}
執行結果:
第一次進佇列:Header: 1
Length: 10
1 出佇列了
2 出佇列了
3 出佇列了
4 出佇列了
5 出佇列了
第二次進佇列:
Header: 6
Length: 5
6 出佇列了
7 出佇列了
8 出佇列了
9 出佇列了
10 出佇列了
1 出佇列了
2 出佇列了
3 出佇列了
4 出佇列了
5 出佇列了
6 出佇列了
7 出佇列了
8 出佇列了
9 出佇列了
10 出佇列了
請按任意鍵繼續. . .
如有錯誤,望不吝指出。
相關文章
- 通過佇列實現棧OR通過棧實現佇列佇列
- 9. 題目:對佇列實現棧&用棧實現佇列佇列
- 用佇列實現棧佇列
- 用棧實現佇列佇列
- Day 10| 232.用棧實現佇列 、 225. 用佇列實現棧佇列
- 【資料結構】迴圈佇列 C語言實現資料結構佇列C語言
- 兩個棧實現佇列佇列
- 兩個棧實現佇列操作佇列
- 用JavaScript實現棧與佇列JavaScript佇列
- leedcode-用棧實現佇列佇列
- leedcode-用佇列實現棧佇列
- LeetCode225.佇列實現棧LeetCode佇列
- 《劍指 Offer》棧實現佇列佇列
- 用2個棧實現佇列佇列
- 佇列(Queue)-c實現佇列
- LeetCode225. 用佇列實現棧LeetCode佇列
- 1201-用棧實現最小佇列佇列
- 力扣-232. 用棧實現佇列力扣佇列
- 迴圈佇列C++實現佇列C++
- 用佇列實現棧,用棧實現佇列,聽起來有點繞,都搞懂了就掌握了精髓!佇列
- C語言陣列實現三子棋C語言陣列
- C語言/C++程式設計學習:棧的程式碼實現之陣列方案C語言C++程式設計陣列
- 題目9:用兩個棧實現佇列佇列
- 資料結構-js實現棧和佇列資料結構JS佇列
- 程式碼隨想錄:用棧實現佇列佇列
- 程式碼隨想錄:用佇列實現棧佇列
- 掃雷--C語言實現C語言
- c語言實現階乘C語言
- 【ZJOF】用來個棧來實現一個佇列佇列
- php實現基本資料結構之棧、佇列PHP資料結構佇列
- offer通過--7兩個棧實現佇列-2佇列
- offer通過--8兩個棧實現佇列-2佇列
- 面試題之【用兩個棧實現佇列】面試題佇列
- C語言__LINE__實現原理C語言
- C語言實現檔案加密C語言加密
- c語言實現this指標效果C語言指標
- 高精度加法(C語言實現)C語言
- C語言實現TCP通訊C語言TCP
- 劍指offer-用兩個棧實現佇列-php佇列PHP