c語言 兩個佇列實現乙個棧

2021-09-24 13:53:47 字數 4059 閱讀 3633

核心思想:模擬出棧的後進先出操作

建立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...