已知Q是一个非空队列,S是一个空栈。仅用队列和栈的操作编写一个算法,将队列Q中的所有元素逆置。
程序有些问题,帮忙找下#include<malloc.h> /* malloc()等 */
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<stdlib.h> /* atoi() */
#include<process.h> /* exit() */
//队列的定义
struct QueueRecord;
typedef struct QueueRecord *Queue;
#define MinQueueSize 5
typedef char ElementType ;
struct QueueRecord
{
int Capacity;
int Front;
int Rear;
int Size;
ElementType *Array;
};
void MakeEmpty(Queue Q)
{
Q->Size=0;
Q->Front=1;
Q->Rear=0;
}
int IsEmpty(Queue Q )
{ return Q->Size==0;
}
int IsFull(Queue Q)
{ return Q->Size==Q->Capacity;
}
static int Succ(int Value, Queue Q)
{
if(++Value ==Q->Capacity )
Value=0 ;
return Value;
}
void Enqueue(ElementType X, Queue Q)
{
if(IsFull (Q ) )
printf("Full queue");
else
{
Q->Size++ ;//队列大小加1
Q->Rear=Succ(Q->Rear,Q);
Q->Array[Q->Rear]=X ;//将元素X插入队列中
}
}
ElementType Dequeue(Queue Q)
{ ElementType c2;
if(IsEmpty (Q) )
{printf("Empty");
exit(0);}
Q->Size--;//队列大小减一
if(Q->Front<=Q->Capacity-1)
{
c2=Q->Array[Q->Front];
Q->Array[Q->Front]=Q->Array[Q->Front++];
}
else c2=Q->Array[Q->Rear];
return c2;
}
Queue CreateQueue(int MaxElements )
{
Queue Q;
/* 1 */ if(MaxElements<MinQueueSize)
/* 2 */ { printf("Queue size is too small");
exit(0);
}
/* 3 */ Q=(Queue)malloc(sizeof(struct QueueRecord ) );
/* 4 */ if(Q==NULL)
/* 5 */ { printf("Out of space!!!");
exit(0);
}
/* 6 */ Q->Array=(ElementType *)malloc(sizeof(ElementType)*MaxElements);
/* 7 */ if(Q->Array==NULL)
/* 8 */ { printf("Out of space!!");
exit(0);
}
/* 9 */ Q->Capacity=MaxElements;
/*10*/ MakeEmpty(Q);
/*11*/ return Q;
}
//栈定义
struct StackRecord;
typedef struct StackRecord *Stack;
typedef char ElementType;
#define EmptyTOS -1
#define MinStackSize 5
struct StackRecord
{
int Capacity;
int TopOfStack;
ElementType *Array;
};
void MakeEmpty(Stack S)
{
S->TopOfStack=EmptyTOS;
}
int IsFull(Stack S)
{ return S->TopOfStack==S->Capacity;
}
int IsEmpty(Stack S)
{ return S->TopOfStack==EmptyTOS;
}
Stack CreateStack(int MaxElements )
{
Stack S;
/* 1 */ if(MaxElements<MinStackSize)
/* 2 */ {printf("Stack size is too small");
exit(0);
}
/* 3 */ S=(Stack)malloc(sizeof(struct StackRecord ) );
/* 4 */ if(S==NULL)
/* 5 */ { printf("Out of space!!l");
exit(0);
}
/* 6 */ S->Array=(ElementType *)malloc(sizeof(ElementType)*MaxElements);
/* 7 */ if(S->Array==NULL)
/* 8 */ { printf("Out of space!!l");
exit(0);
}
/* 9 */ S->Capacity=MaxElements;
/*10*/ MakeEmpty(S);
/*11*/ return S;
}
void DisposeStack(Stack S)
{
if(S!=NULL)
{
free(S->Array);
free(S);
}
}
void Push(ElementType X, Stack S)
{
if( IsFull(S) )
{ printf("Full stack");
exit(0); }
else
S ->Array[++S->TopOfStack]=X;//将元素X放入栈中
}
ElementType Top(Stack S)
{
if(!IsFull(S))
return S->Array[S-> TopOfStack];//返回栈顶元素
/* Return value used to avoid warning */
}
void Pop(Stack S)
{
if(IsEmpty(S) )
{ printf("Empty stack");
exit(0);
}
else
S->TopOfStack--;
}
ElementType TopAndPop(Stack S )
{
if(!IsEmpty(S) )
return S->Array[S->TopOfStack--];
}
//已知Q是一个非空队列,S是一个空栈。仅用队列和栈的操作编写一个算法,将队列Q中的所有元素逆置。
void Invert(Queue Q,Stack S,int n)//这个子函数好像错在哪里了?
/*借用栈将队列逆置*/
{
char c;ElementType c1,c2;int i;
for(i=1;i<=n;i++)
{c1=Q->Array[Q->Front];
Push(c1,S);
Dequeue(Q);}
for(i=1;i<=n;i++)
c2=TopAndPop(S);
Enqueue(c2,Q);
}
void main(void)
{
char c1,c2;
Queue Q;
Stack S;
printf("请输入队列大小:(n>=5)\n");
int i,MAX;
scanf("%d",&MAX);
getchar();
Q=CreateQueue(MAX);//建立一个大小MAX的队列
printf("\n");
printf("输入\n");
for(i=1;i<=MAX;i++)
{scanf("%c",&c1);getchar();
Enqueue(c1,Q);//将元素c1插入队列中
}
for(i=0;i<MAX;i++)
{
c2=Dequeue(Q);
printf("%c ",c2);
}
Invert(Q,S,MAX);
for(i=0;i<MAX;i++)
{
c2=Dequeue(Q);
printf("%c ",c2);
}
}