資料結構 兩個佇列實現乙個棧

2021-08-20 08:19:00 字數 3386 閱讀 8597

void stackinit(stack* stack); //初始化

void stackdestroy(stack* stack);//銷毀

void stackprint(stack* stack,const char* msg);//列印棧

void stackpush(stack* stack,datatype value);//入棧

void stackpop(stack* stack);//出棧

int stackget(stack* stack,datatype* value);//取棧頂元素

#include"stack_by_2queue.h"

//佇列初始化

void queueinit(queue* queue)

queue->head = 0;

queue->tail = 0;

queue->size = 0;

}//銷毀佇列

void queuedestroy(queue* queue)

queue->head = 0;

queue->tail = 0;

queue->size = 0;

}//入佇列

void queuepush(queue* queue,datatype value)

if(queue->size >= maxsize)

queue->data[queue->tail++] = value;

queue->size++;

if((queue->tail) > maxsize && (queue->size < maxsize)) }

//出佇列

void queuepop(queue* queue)

if(queue->size == 0)

if(queue->head >= maxsize)

queue->head++;

queue->size--;

if(queue->size == 0)

return;

}datatype queueget(queue* queue)

if(queue->size == 0)

return queue->data[queue->head];

}//列印(按理說佇列不允許被列印,此處為了為了測試**是否正確)

void print(queue* queue)

if(queue -> size == 0)

//tail在head後面

if(queue->head < queue->tail) }

//tail在head前面

if(queue->head > queue->tail)

i = 0;

for(;itail;i++)

}printf("\n");

}//初始化棧

void stackinit(stack* stack)

queueinit(&stack->queue1);

queueinit(&stack->queue2);

stack->size = 0;

}//銷毀棧

void stackdestroy(stack* stack)

queuedestroy(&stack->queue1);

queuedestroy(&stack->queue2);

stack->size = 0;

}//列印棧元素

void stackprint(stack* stack,const char* msg)

if(stack->size == 0)

queue* print = null;

if(stack->queue1.size == 0)

else

print(print);

}//入棧

void stackpush(stack* stack,datatype value)

if(stack->size > maxsize)

if(stack->queue1.size != 0)

else }

//出棧

void stackpop(stack* stack)

if(stack->size == 0)

queue* from = null;

queue* to = null;

if(stack->queue1.size != 0)

else

while(from->size != 1)

//經過迴圈後,取得隊尾元素,將其出佇列,完成出棧

queuepop(from);

}//取棧頂元素

int stackget(stack* stack,datatype* value)

if(stack->size == 0)

queue* from = null;

queue* to = null;

if(stack->queue1.size != 0)

else

while(from->size != 1)

//迴圈結束後,取得隊尾元素即為棧頂元素

*value = from->data[from->head];

//取得棧頂元素後,將from佇列的最後乙個元素入佇列到to佇列

datatype head = queueget(from);

queuepop(from);

//將from的隊首元素的data入佇列到to

queuepush(to,head);

return 1; }

///// 以下為測試函式 //

資料結構 兩個佇列實現乙個棧

用兩個棧實現乙個佇列,這個問題與 兩個佇列實現乙個棧 原理非常的相似。只要你明白了 兩個佇列實現乙個棧 的原理,相信聰明的你,就會明白這個問題只是它的變種,所有的異或就會迎刃而解的。這裡大家可以參考我的部落格 如下 define crt secure no warnings 1 includeusi...

資料結構 兩個棧實現乙個佇列

棧的特性是先進後出,佇列的特性是先進先出。那麼,我們使用兩個棧,對同乙個元素進行先進後出兩次棧就形成了先進先出的順序。即乙個元素需要入棧兩次,才能被取出來。我們將put,get定義為存放元素,與取元素。使用命名為in,out的棧,in代表往佇列裡面put元素第一次入棧是進入in,out代表get元素...

資料結構 兩個棧實現乙個佇列 面試

棧結構 先進後出,後進先出,只允許在棧尾操作。佇列 先進先出,在隊尾入隊,在隊頭出隊。要想用兩個棧實現乙個佇列,就需要使用乙個相當於中間量的結構進行佇列的入隊和出隊操作。用圖形象化為 這樣問題就從圖中得出了思路 入隊操作 把入隊元素一一存入乙個棧結構中即可。出隊操作 出隊時,先判斷另乙個棧結構中是否...