核心思想:模擬出佇列先進先出的資料結構
假設有兩個棧input和output,input模擬棧的資料插入,當需要模擬出佇列操作時,input棧中的a,b,c,d會按照d,c,b,a的順序進入棧output。 只要output棧不為空,出佇列操作就可以通過output的出棧操作來實現。
若output棧為空,則繼續從input棧匯入資料。
若兩個棧都為空,即整個隊列為空。
**模擬:
queueby_two_stack.h
#pragma once
typedef
int datatype;
typedef
struct stack
stack;
typedef
struct queue
queue;
//初始化函式
void
queueinit
(queue *queue)
;//銷毀函式
void
queuedestory
(queue *queue)
;//入棧函式
void
queuepush
(queue *queue, datatype value)
;//出棧函式
void
queuepop
(queue *queue)
;//取棧頂元素函式
datatype queuefront
(queue *queue)
;
queueby_two_stack.c
#include
#include
#include
#include
"queueby_two_stack.h"
void
stackinit
(stack* stack,datatype capacity)
stack->capacity = capacity;
stack->size =0;
stack->data =
(datatype*
)malloc
(sizeof
(datatype)
* stack->capacity);}
//棧銷毀函式
void
stackdestory
(stack* stack)
free
(stack->data)
; stack->data =
null
; stack->capacity =0;
stack->size =0;
}//入棧操作
void
stackpush
(stack* stack,datatype value)if(
stackfull
(stack)
)for
(int i =
0; i < stack->size;
++i)
stack->data = newdate;
stack->capacity = new_capacity;
}else
}int
stackfull
(stack* stack)
if(stack->size == stack->capacity)
else
}int
stackempty
(stack* stack)
if(stack->size ==0)
else
}//出棧操作
intstackpop
(stack* stack)
if(stack->size ==0)
stack->size--;}
//取棧頂元素
datatype stackgettop
(stack* stack)
if(stack->size ==0)
else
}//佇列初始化函式
void
queueinit
(queue* queue,datatype capacity)
stackinit
(&queue->input,capacity)
;stackinit
(&queue->output, capacity)
; queue->size =0;
}//佇列銷毀函式
void
queuedestory
(queue *queue)
stackdestory
(&queue->input)
;stackdestory
(&queue->output)
; queue->size =0;
}//入佇列函式
void
queuepush
(queue *queue, datatype value)
stackpush
(&queue->input, value)
; queue->size++;}
//出佇列函式
void
queuepop
(queue* queue)if(
stackempty
(&queue->output)
)else}}
stackpop
(&queue->output)
; queue->size--;}
//取隊首元素函式
datatype queuefront
(queue* queue)if(
stackempty
(&queue->output)
)else}}
return
stackgettop
(&queue->output);}
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...