两个队列实现一个栈
#include <stdio.h>
#include <stdlib.h>
typedef struct QNode{
int data;
struct QNode *next;
}QNode, * QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
int InitQueue_L(LinkQueue *Q){
(*Q).front = (*Q).rear = (QueuePtr)malloc(sizeof(QNode));
if(!(*Q).front)
exit(0);
(*Q).front->next = NULL;
return 1;
}
int QueueEmpty_L(LinkQueue Q){
if(Q.front==Q.rear)
return 1;
else
return 0;
}
int QueueLength_L(LinkQueue Q){
int count = 0;
QueuePtr p = Q.front;
while(p!=Q.rear){
count++;
p = p->next;
}
return count;
}
int GetHead_L(LinkQueue Q, int *e){
QueuePtr p;
if(Q.front==Q.rear)
return 0;
p = Q.front->next;
*e = p->data;
return 1;
}
int EnQueue_L(LinkQueue *Q, int e){
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if(!p)
exit(0);
p->data = e;
p->next = NULL;
(*Q).rear->next = p;
(*Q).rear=p;
return 1;
}
int DeQueue_L(LinkQueue *Q, int *e){
QueuePtr p;
if((*Q).front==(*Q).rear)
return 0;
p = (*Q).front->next;
*e = p->data;
(*Q).front->next = p->next;
if((*Q).rear==p)
(*Q).rear = (*Q).front;
free(p);
return 1;
}
void QueueTraverse_L(LinkQueue Q){
QueuePtr p;
p = Q.front->next;
while(p){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void Push(LinkQueue *Q1, int e){
EnQueue_L(Q1, e);
}
int Pop(LinkQueue *Q1, LinkQueue *Q2){
int e, tmp;
if(QueueEmpty_L(*Q1))
exit(0);
while(!QueueEmpty_L(*Q1)){
if(QueueLength_L(*Q1)==1){
DeQueue_L(Q1, &e);
break;
}
else{
DeQueue_L(Q1, &tmp);
EnQueue_L(Q2, tmp);
}
}
while(!QueueEmpty_L(*Q2)){
DeQueue_L(Q2, &tmp);
EnQueue_L(Q1, tmp);
}
return e;
}
int main(){
LinkQueue Q1, Q2;
int i;
printf("初始化链队Q1、Q2 ...\n");
InitQueue_L(&Q1);
InitQueue_L(&Q2);
for(i=1; i<=6; i++){
printf("元素 \"%2d\" 入模拟栈,", 2*i);
Push(&Q1, 2*i);
printf("(累计第 %d 个元素)...\n", QueueLength_L(Q1));
}
printf("链队Q1中的元素为:\n");
QueueTraverse_L(Q1);
printf("链队Q2中的元素为:\n");
QueueTraverse_L(Q2);
printf("用Q1和Q2模拟栈...\n");
printf("栈顶元素 %d 出栈\n", Pop(&Q1, &Q2));
printf("链队Q1中的元素为:\n");
QueueTraverse_L(Q1);
printf("链队Q2中的元素为:\n");
QueueTraverse_L(Q2);
return 0;
}