當看到用兩個棧實現隊列以後,大家有沒有興趣用兩個隊列實現一個棧呢,呵呵!現在就來介紹用兩個隊列實現一個棧。
如圖
這裏介紹隊列的常用操作:
l 創建棧
l 銷燬棧
l 清空棧
l 壓棧
l 出棧
l 返回棧頂元素
l 返回棧的大小
代碼總分爲三個文件:
QStack.h : 放置功能函數的聲明,以及表的聲明
QStack.c : 放置功能函數的定義,以及表的定義
Main.c : 主函數,使用功能函數完成各種需求,一般用作測試
整體結構圖爲:
這裏詳細說下壓棧操作,出棧操作和返回棧頂元素操作:
壓棧操作:
- int QStack_Push(QStack* stack, void* item)
- {
- TQStack* aStack = (TQStack*)stack;
- int ret = (NULL!=aStack) && (NULL!=item);
- if(ret)
- {
- if(0 == LinkQueue_Length(aStack->queue_A))
- {
- ret = LinkQueue_Append(aStack->queue_B, item);
- }
- else
- {
- ret = LinkQueue_Append(aStack->queue_A, item);
- }
- }
- return ret;
- }
如圖:
出棧操作:
- void* QStack_Pop(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- void* ret = NULL;
- if((NULL!=aStack) && (0<QStack_Length(aStack)))
- {
- if(0 == LinkQueue_Length(aStack->queue_B))
- {
- while(LinkQueue_Length(aStack->queue_A) > 1)
- {
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- ret = LinkQueue_Retrieve(aStack->queue_A);
- }
- else
- {
- while(LinkQueue_Length(aStack->queue_B) > 1)
- {
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- ret = LinkQueue_Retrieve(aStack->queue_B);
- }
- }
- return ret;
- }
如圖:
返回棧頂元素:
- void* QStack_Top(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- void* ret = NULL;
- if((NULL!=aStack) && (0<QStack_Length(stack)))
- {
- if(0 == LinkQueue_Length(aStack->queue_B))
- {
- while(LinkQueue_Length(aStack->queue_A) > 1)
- {
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- ret = LinkQueue_Header(aStack->queue_A);
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- else
- {
- while(LinkQueue_Length(aStack->queue_B) > 1)
- {
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- ret = LinkQueue_Header(aStack->queue_B);
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- }
- return ret;
- }
如圖:
OK! 上代碼:
QStack.h :
- #ifndef _QSTACK_H_
- #define _QSTACK_H_
- typedef void QStack;
- QStack* QStack_Create();
- void QStack_Destroy(QStack* stack);
- void QStack_Clear(QStack* stack);
- int QStack_Push(QStack* stack, void* item);
- void* QStack_Pop(QStack* stack);
- void* QStack_Top(QStack* stack);
- int QStack_Length(QStack* stack);
- #endif
QStack.c :
- #include <malloc.h>
- #include “LinkQueue.h”
- #include “QStack.h”
- typedef struct _tag_QStack
- {
- LinkQueue* queue_A;
- LinkQueue* queue_B;
- }TQStack;
- QStack* QStack_Create()
- {
- TQStack* ret = (TQStack*)malloc(sizeof(TQStack));
- if(NULL != ret)
- {
- ret->queue_A = LinkQueue_Create();
- ret->queue_B = LinkQueue_Create();
- if((NULL==ret->queue_A) || (NULL==ret->queue_B))
- {
- LinkQueue_Destroy(ret->queue_A);
- LinkQueue_Destroy(ret->queue_B);
- free(ret);
- ret = NULL;
- }
- }
- return ret;
- }
- void QStack_Destroy(QStack* stack)
- {
- QStack_Clear(stack);
- free(stack);
- }
- void QStack_Clear(QStack* stack)
- {
- while(QStack_Length(stack) > 0)
- {
- QStack_Pop(stack);
- }
- }
- int QStack_Push(QStack* stack, void* item)
- {
- TQStack* aStack = (TQStack*)stack;
- int ret = (NULL!=aStack) && (NULL!=item);
- if(ret)
- {
- if(0 == LinkQueue_Length(aStack->queue_A))
- {
- ret = LinkQueue_Append(aStack->queue_B, item);
- }
- else
- {
- ret = LinkQueue_Append(aStack->queue_A, item);
- }
- }
- return ret;
- }
- void* QStack_Pop(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- void* ret = NULL;
- if((NULL!=aStack) && (0<QStack_Length(aStack)))
- {
- if(0 == LinkQueue_Length(aStack->queue_B))
- {
- while(LinkQueue_Length(aStack->queue_A) > 1)
- {
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- ret = LinkQueue_Retrieve(aStack->queue_A);
- }
- else
- {
- while(LinkQueue_Length(aStack->queue_B) > 1)
- {
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- ret = LinkQueue_Retrieve(aStack->queue_B);
- }
- }
- return ret;
- }
- void* QStack_Top(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- void* ret = NULL;
- if((NULL!=aStack) && (0<QStack_Length(stack)))
- {
- if(0 == LinkQueue_Length(aStack->queue_B))
- {
- while(LinkQueue_Length(aStack->queue_A) > 1)
- {
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- ret = LinkQueue_Header(aStack->queue_A);
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- else
- {
- while(LinkQueue_Length(aStack->queue_B) > 1)
- {
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- ret = LinkQueue_Header(aStack->queue_B);
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- }
- return ret;
- }
- int QStack_Length(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- int ret = -1;
- if(NULL != aStack)
- {
- ret = LinkQueue_Length(aStack->queue_B) +
- LinkQueue_Length(aStack->queue_A);
- }
- return ret;
- }
Main.c :
- #include <stdio.h>
- #include “QStack.h”
- int main(void)
- {
- QStack* stack = QStack_Create();
- int a[10];
- int i = 0;
- for(i=0; i<10; i++)
- {
- a[i] = i;
- QStack_Push(stack, a+i);
- }
- printf(”Header: %d\n”, *(int*)QStack_Top(stack));
- printf(”Length: %d\n\n”, QStack_Length(stack));
- while(QStack_Length(stack) > 0)
- {
- printf(”Pop: %d\n”, *(int*)QStack_Pop(stack));
- }
- printf(”\n”);
- for(i=0; i<6; i++)
- {
- a[i] = i+10;
- QStack_Push(stack, a+i);
- }
- while(QStack_Length(stack) > 0)
- {
- printf(”Pop: %d\n”, *(int*)QStack_Pop(stack));
- }
- QStack_Destroy(stack);
- return 0;
- }
當看到用兩個棧實現隊列以後,大家有沒有興趣用兩個隊列實現一個棧呢,呵呵!現在就來介紹用兩個隊列實現一個棧。
如圖
這裏介紹隊列的常用操作:
l 創建棧
l 銷燬棧
l 清空棧
l 壓棧
l 出棧
l 返回棧頂元素
l 返回棧的大小
代碼總分爲三個文件:
QStack.h : 放置功能函數的聲明,以及表的聲明
QStack.c : 放置功能函數的定義,以及表的定義
Main.c : 主函數,使用功能函數完成各種需求,一般用作測試
整體結構圖爲:
這裏詳細說下壓棧操作,出棧操作和返回棧頂元素操作:
壓棧操作:
- int QStack_Push(QStack* stack, void* item)
- {
- TQStack* aStack = (TQStack*)stack;
- int ret = (NULL!=aStack) && (NULL!=item);
- if(ret)
- {
- if(0 == LinkQueue_Length(aStack->queue_A))
- {
- ret = LinkQueue_Append(aStack->queue_B, item);
- }
- else
- {
- ret = LinkQueue_Append(aStack->queue_A, item);
- }
- }
- return ret;
- }
如圖:
出棧操作:
- void* QStack_Pop(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- void* ret = NULL;
- if((NULL!=aStack) && (0<QStack_Length(aStack)))
- {
- if(0 == LinkQueue_Length(aStack->queue_B))
- {
- while(LinkQueue_Length(aStack->queue_A) > 1)
- {
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- ret = LinkQueue_Retrieve(aStack->queue_A);
- }
- else
- {
- while(LinkQueue_Length(aStack->queue_B) > 1)
- {
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- ret = LinkQueue_Retrieve(aStack->queue_B);
- }
- }
- return ret;
- }
如圖:
返回棧頂元素:
- void* QStack_Top(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- void* ret = NULL;
- if((NULL!=aStack) && (0<QStack_Length(stack)))
- {
- if(0 == LinkQueue_Length(aStack->queue_B))
- {
- while(LinkQueue_Length(aStack->queue_A) > 1)
- {
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- ret = LinkQueue_Header(aStack->queue_A);
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- else
- {
- while(LinkQueue_Length(aStack->queue_B) > 1)
- {
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- ret = LinkQueue_Header(aStack->queue_B);
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- }
- return ret;
- }
如圖:
OK! 上代碼:
QStack.h :
- #ifndef _QSTACK_H_
- #define _QSTACK_H_
- typedef void QStack;
- QStack* QStack_Create();
- void QStack_Destroy(QStack* stack);
- void QStack_Clear(QStack* stack);
- int QStack_Push(QStack* stack, void* item);
- void* QStack_Pop(QStack* stack);
- void* QStack_Top(QStack* stack);
- int QStack_Length(QStack* stack);
- #endif
QStack.c :
- #include <malloc.h>
- #include “LinkQueue.h”
- #include “QStack.h”
- typedef struct _tag_QStack
- {
- LinkQueue* queue_A;
- LinkQueue* queue_B;
- }TQStack;
- QStack* QStack_Create()
- {
- TQStack* ret = (TQStack*)malloc(sizeof(TQStack));
- if(NULL != ret)
- {
- ret->queue_A = LinkQueue_Create();
- ret->queue_B = LinkQueue_Create();
- if((NULL==ret->queue_A) || (NULL==ret->queue_B))
- {
- LinkQueue_Destroy(ret->queue_A);
- LinkQueue_Destroy(ret->queue_B);
- free(ret);
- ret = NULL;
- }
- }
- return ret;
- }
- void QStack_Destroy(QStack* stack)
- {
- QStack_Clear(stack);
- free(stack);
- }
- void QStack_Clear(QStack* stack)
- {
- while(QStack_Length(stack) > 0)
- {
- QStack_Pop(stack);
- }
- }
- int QStack_Push(QStack* stack, void* item)
- {
- TQStack* aStack = (TQStack*)stack;
- int ret = (NULL!=aStack) && (NULL!=item);
- if(ret)
- {
- if(0 == LinkQueue_Length(aStack->queue_A))
- {
- ret = LinkQueue_Append(aStack->queue_B, item);
- }
- else
- {
- ret = LinkQueue_Append(aStack->queue_A, item);
- }
- }
- return ret;
- }
- void* QStack_Pop(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- void* ret = NULL;
- if((NULL!=aStack) && (0<QStack_Length(aStack)))
- {
- if(0 == LinkQueue_Length(aStack->queue_B))
- {
- while(LinkQueue_Length(aStack->queue_A) > 1)
- {
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- ret = LinkQueue_Retrieve(aStack->queue_A);
- }
- else
- {
- while(LinkQueue_Length(aStack->queue_B) > 1)
- {
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- ret = LinkQueue_Retrieve(aStack->queue_B);
- }
- }
- return ret;
- }
- void* QStack_Top(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- void* ret = NULL;
- if((NULL!=aStack) && (0<QStack_Length(stack)))
- {
- if(0 == LinkQueue_Length(aStack->queue_B))
- {
- while(LinkQueue_Length(aStack->queue_A) > 1)
- {
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- ret = LinkQueue_Header(aStack->queue_A);
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- else
- {
- while(LinkQueue_Length(aStack->queue_B) > 1)
- {
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- ret = LinkQueue_Header(aStack->queue_B);
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- }
- return ret;
- }
- int QStack_Length(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- int ret = -1;
- if(NULL != aStack)
- {
- ret = LinkQueue_Length(aStack->queue_B) +
- LinkQueue_Length(aStack->queue_A);
- }
- return ret;
- }
Main.c :
- #include <stdio.h>
- #include “QStack.h”
- int main(void)
- {
- QStack* stack = QStack_Create();
- int a[10];
- int i = 0;
- for(i=0; i<10; i++)
- {
- a[i] = i;
- QStack_Push(stack, a+i);
- }
- printf(”Header: %d\n”, *(int*)QStack_Top(stack));
- printf(”Length: %d\n\n”, QStack_Length(stack));
- while(QStack_Length(stack) > 0)
- {
- printf(”Pop: %d\n”, *(int*)QStack_Pop(stack));
- }
- printf(”\n”);
- for(i=0; i<6; i++)
- {
- a[i] = i+10;
- QStack_Push(stack, a+i);
- }
- while(QStack_Length(stack) > 0)
- {
- printf(”Pop: %d\n”, *(int*)QStack_Pop(stack));
- }
- QStack_Destroy(stack);
- return 0;
- }