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

2021-09-24 13:53:47 字數 3069 閱讀 6735

核心思想:模擬出佇列先進先出的資料結構

假設有兩個棧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...