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