题目
编程实现利用队列将栈中元素逆置的算法。
逆置函数
void Inverse(Stack *S,Queue *Q){
ElemType x;
while(!IsEmpty(S)){ //函数重载
Top(S,&x);
EnQueue(Q,x);
Pop(S);
}
while(!IsEmpty(Q)){ //函数重载
Front(Q,&x);
Push(S,x);
DeQueue(Q);
}
}
完整程序
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define N 100
typedef int BOOL;
typedef int ElemType;
typedef struct{
int top;
int maxSize;
ElemType *element;
}Stack;
/*
void Create1(Stack *S, int mSize);
BOOL IsEmpty1(Stack *S);
BOOL IsFULL1(Stack *S);
BOOL Top(Stack *S,ElemType *x);
BOOL Push(Stack *S,ElemType x);
BOOL Pop(Stack *S);
void Create2(Queue *Q,int mSize);
BOOL IsEmpty2(Queue *Q);
BOOL IsFULL2(Queue *Q);
BOOL Front2(Queue *Q,ElemType *x);
BOOL DeQueue(Queue *Q);
void Output(Stack *S,int n);
int Inverse(Stack *S,Queue *Q,int n);
*/
void Create1(Stack *S, int mSize){
S->maxSize=mSize-1;
S->element=(ElemType*)malloc(sizeof(ElemType)*mSize);
S->top=-1;
}
BOOL IsEmpty(Stack *S){
return S->top==-1;
}
BOOL IsFULL1(Stack *S){
return S->top==S->maxSize;
}
BOOL Top(Stack *S,ElemType *x){
if(IsEmpty(S))
return FALSE;
*x=S->element[S->top];
return TRUE;
}
BOOL Push(Stack *S,ElemType x){
if(IsFULL1(S))
return FALSE;
S->top++;
S->element[S->top]=x;
return TRUE;
}
BOOL Pop(Stack *S){
if(IsEmpty(S))
return FALSE;
S->top--;
return TRUE;
}
typedef struct{
int front;
int rear;
int maxSize;
ElemType *element;
}Queue;
void Create2(Queue *Q,int mSize){
Q->maxSize=mSize;
Q->element=(ElemType*)malloc(sizeof(ElemType)*mSize);
Q->front=Q->rear=0;
}
BOOL IsEmpty(Queue *Q){
return Q->front==Q->rear;
}
BOOL IsFULL2(Queue *Q){
return (Q->rear+1)%Q->maxSize==Q->front;
}
BOOL Front(Queue *Q,ElemType *x){
if(IsEmpty(Q))
return FALSE;
*x=Q->element[(Q->front+1)%Q->maxSize];
return TRUE;
}
BOOL EnQueue(Queue *Q,ElemType x){
if(IsFULL2(Q))
return FALSE;
Q->rear=(Q->rear+1)%Q->maxSize;
Q->element[Q->rear]=x;
return TRUE;
}
BOOL DeQueue(Queue *Q){
if(IsEmpty(Q)){
return FALSE;
}
Q->front=(Q->front+1)%Q->maxSize;
return TRUE;
}
/*
void Output(Stack *S,int n){
int i;
i=S->top;
if(S->top==-1){
printf("NULL");
}
while(S->top!=-1){
printf("%d",S[i--]);
}
printf("\n");
}
*/
void PrintStack(Stack *S){
if(!IsEmpty(S)){
for(int i=S->top;i>=0;i--){ //不需要top-1,因为top指向栈顶
printf("%d ",S->element[i]);
}
}
else printf("The stack is empty\n");
}
/*
int Inverse(Stack *S,Queue *Q,int n){
int i;
ElemType a[N];
for(i=0;i<n;i++){
if(IsEmpty1(S)){
return FALSE;
}
a[i]=S->element[S->top];
EnQueue(Q,a[i]);
Pop(S);
}
for(i=0;i<n;i++){
if(IsEmpty2(Q)){
return FALSE;
}
a[i]=Q->element[Q->front+1%Q->maxSize];
Push(S,a[i]);
DeQueue(Q);
}
}
*/
void Inverse(Stack *S,Queue *Q){
ElemType x;
while(!IsEmpty(S)){ //函数重载
Top(S,&x);
EnQueue(Q,x);
Pop(S);
}
while(!IsEmpty(Q)){ //函数重载
Front(Q,&x);
Push(S,x);
DeQueue(Q);
}
}
int main(){
int n,i,x;
Stack S;
Queue Q;
scanf("%d",&n);
// printf("\n");
Create1(&S,n);
Create2(&Q,n+1); // 防止出现空队列,满队列的情况
for(i=0;i<n;i++){
scanf("%d",&x);
Push(&S,x);
}
// Output(&S,n);
Inverse(&S,&Q);
//Output(&S,n);
PrintStack(&S);
return 0;
}
实验结果
将 2 3 1 5 4 依次入栈,然后利用队列进行逆置,最后输出新栈的元素,是从 top 开始打印的。
版权声明:本文为博主原创文章,如有错误,恳请大家在评论区指出,在下不胜感激~如要转载注明出处即可~