核心思想:模擬出棧的後進先出操作
建立queue1和queue2,入棧時選擇乙個非空佇列執行入佇列操作(若兩個佇列都為空,則隨機選擇乙個佇列),出棧時需要先從非空佇列queue1把數依次進入空數列queue2,直到queue1中到最後乙個數為止,然後將queue1中的數出佇列,模擬出棧的後進先出操作。
**模擬
stackby_two_queue.h
#pragma once
typedef
char datatype2;
typedef
struct queue
queue;
typedef
struct stack
stack;
//棧的初始化
void
stackinit
(stack *stack,
int vector_capacity)
;//棧的銷毀
void
stackdestory
(stack* stack)
;//入棧
void
stackpush
(stack* stack, datatype2 value)
;//出棧
void
stackpop
(stack* stack)
;//取棧頂元素
datatype2 stackgettop
(stack* stack)
;
stackby_two_queue.c
#include
#include
#include
#include
"stackby_two_queue.h"
void
queueinit
(queue* queue,
int vector_capacity)
queue->capacity = vector_capacity;
queue->queue_data =
(datatype2*
)malloc
(sizeof
(datatype2)
*queue->capacity)
; queue->size =0;
queue->head =0;
queue->tail =0;
}void
queuedestory
(queue* queue)
free
(queue->queue_data)
; queue->queue_data =
null
; queue->size =0;
queue->head =0;
queue->tail =0;
queue->capacity =0;
}void
queuepush
(queue* queue,datatype2 value)
if(queue->size >= queue->capacity)
queue->queue_data[queue->tail++
]= value;
queue->size++;if
(queue->tail > queue->capacity)
}void
queuepop
(queue* queue)
if(queue->size ==0)
if(queue->head >= queue->capacity)
queue->head++
; queue->size--;if
(queue->size ==0)
}//取隊首元素
datatype2 queuegettop
(queue* queue)
if(queue->size ==0)
return queue->queue_data[queue->head];}
//列印整個佇列
void
printqueue
(queue* queue)
if(queue->size ==0)
if(queue->head < queue->tail)
}else
queue->head =0;
for(i = queue->head; i < queue->tail;
++i)
}printf
("\n");
}//通過兩個佇列實現乙個棧的入棧,出棧和取棧頂元素操作
//棧的初始化函式
void
stackinit
(stack* stack,
int vector_capacity)
queueinit
(&stack->queue1,vector_capacity)
;queueinit
(&stack->queue2,vector_capacity)
; stack->size =0;
}//銷毀乙個棧
void
stackdestory
(stack* stack)
queuedestory
(&stack->queue1)
;queuedestory
(&stack->queue2)
; stack->size =0;
}//入棧操作
void
stackpush
(stack* stack,datatype2 value)
if(stack->queue1.size !=0)
else
stack->size++;}
void
stackpop
(stack* stack)
if(stack->queue1.size ==
0&& stack->queue2.size ==0)
queue* from =
null
; queue* to =
null
;//判斷資料放在了哪個佇列
if(stack->queue1.size !=0)
else
while
(from->size >1)
//把from佇列剩的最後乙個元素移出佇列,模擬出棧
queuepop
(from)
;//棧中的有效資料個數減一
stack->size--;}
datatype2 stackgettop
(stack* stack)if(
(stack->queue1.size ==0)
&&(stack->queue2.size ==0)
) queue* from =
null
; queue* to =
null
;//判斷資料放在了哪個佇列
if(stack->queue1.size !=0)
else
while
(from->size >1)
//讀取from佇列的最後乙個元素,模擬讀取棧頂
datatype2 stacktop =
queuegettop
(from)
;queuepop
(from)
;queuepush
(to, stacktop)
;return stacktop;
}void
printstack
(stack* stack)
if(stack->size ==0)
queue* print =
null;if
(stack->queue1.size ==0)
else
printqueue
(print);}
intmain()
兩個棧實現乙個佇列 兩個佇列實現乙個棧
這兩個題的思路比較相似。棧的特點是 先進後出 佇列的特點是 先進先出 不要怕!用兩個棧實現乙個佇列很簡單 再將top元素push到stack 2中,然後將stack 1 pop一次直到stack 1剩下最後乙個元素,這個就是最先push進去的,我們把它pop掉就可以了,同理,我們求queue的fro...
兩個棧實現乙個佇列,兩個佇列實現乙個棧
1 兩個棧實現乙個佇列 入隊時,直接壓入stack1中。出隊時,判斷stack2是否為空,如果stack2為空,則將stack1中的元素倒入stack2中,否則直接彈出stack2中的元素。入隊操作 void enqueue stack s1,stack s2,int m 出隊操作 void deq...
兩個棧實現乙個佇列 兩個佇列實現乙個棧
方法一 public class main 出棧操作 public int deletehead while stack1.isempty return stack2.pop 方法二 public class main public int deletehead throws exception i...