队列的逆置
#include <stdio.h>
#include <stdlib.h >
#define OK 1
#define erro -1
#define maxsize 20
typedef int QElem ;
typedef int SElem ;
typedef int Status ;
typedef struct {
QElem data [ maxsize ] ;
int rear ;
int front ;
}Queue ;
typedef struct {
SElem data [ maxsize ] ;
int top ;
}Stack ;
//队列的相关操作
InitQue ( Queue &Q ){//初始化
Q.front = Q.rear = 0 ;
}
Status EmptyQue ( Queue &Q ){//判空
if ( Q.rear == Q.front ){
return true ;
}else {
return false ;
}
}
EnQue ( Queue &Q , QElem e ){//入队
if ( ( Q.rear + 1 ) % maxsize == Q.front ){//判满
printf( " 队列满\n " ) ;
return erro ;
}
Q.data[ Q.rear ] = e ;
Q.rear = Q.rear + 1 ;
return OK ;
}
DeQue ( Queue &Q , QElem &e ){//出队
if ( Q.rear == Q.front ){
printf( " 队列空 \n " ) ;
return erro ;
}
e = Q.data[ Q.front ];
Q.front = Q.front + 1 ;
return e ;
}
//栈的相关操作
InitStack ( Stack &S ){//初始化
S.top = -1 ;
}
Status EmptyStack ( Stack &S ){//判空栈
if ( S.top == -1 ){
return true ;
}else {
return false ;
}
}
Status Push ( Stack &S , SElem x ){//入栈
if ( S.top == maxsize - 1 ){
printf( " 栈满 " ) ;
return erro ;
}
S.top++;
S.data[S.top ] = x ;
return OK ;
}
Status Pop ( Stack &S , SElem &x ){//出栈
if ( S.top == -1 ){
printf( " 栈空 " ) ;
return erro ;
}
x = S.data[ S.top – ] ;
return x ;
}
Status Inverse ( Stack &S , Queue &Q ){//逆置函数
int x , y ;
while ( ! EmptyQue ( Q ) ){//当队列中不为空
y=DeQue ( Q , x ) ;//出队
Push ( S , y ) ;//将队列中的元素入栈
}
while ( ! EmptyStack ( S ) ){//当栈中元素不空
y = Pop ( S , x ) ;//出栈,此时原来的队列中元素已经逆置
EnQue ( Q , y ) ;//再入队,这样队中元素就完成了逆置
}
return OK ;
}
main (){
Queue Q ;
Stack S ;
int x ;
InitQue( Q ) ;
InitStack( S ) ;
EnQue ( Q , 1 ) ;
EnQue ( Q , 2 ) ;
EnQue ( Q , 3 ) ;
//此时队中元素为1,2,3
Inverse ( S , Q ) ;//逆置处理之后
printf( " %d ", DeQue( Q, x ) ) ;
printf( " %d ", DeQue( Q, x ) ) ;
printf( " %d ", DeQue( Q, x ) ) ;//出队验证
//经处理后队中元素变为3,2,1
return OK ;
}
运行结果: