队列的逆置(利用栈)

                      队列的逆置

#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 ;
}

运行结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值