#include <iostream>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
typedef struct //队列的定义
{
char data[MAXSIZE];
int front;
int rear;
}Queue;
typedef struct //栈的定义
{
char data[MAXSIZE];
int top;
}SqStack;
typedef int status;
status InitQueue(Queue &Q) //队列的初始化
{
Q.front=Q.rear=0;
return OK;
}
bool IsEmptyQ(Queue &Q) //判断队列是否为空
{
if (Q.front==Q.rear)
return true;
else
return false;
}
bool IsOverQ(Queue &Q) //判断队列是否为满
{
if (((Q.rear)%MAXSIZE)==Q.front) //这里就想到钟表来理解
return true;
else
return false;
}
status InQueue(Queue &Q,int x) //入队
{
if (IsOverQ(Q)) //队满不入
return ERROR;
else
Q.data[Q.rear]=x;
Q.rear++;
}
status OutQueue(Queue &Q,int &x) //出队
{
if (IsEmptyQ(Q)) //队空不出
return ERROR;
else
printf("%d\n",Q.front);
Q.front++;
}
status InitSqStack(SqStack &S) //初始化栈
{
S.top=-1;
return OK;
}
bool IsEmptyS(SqStack &S) //判断栈是否为空
{
if (S.top==-1)
return true;
else
return false;
}
bool IsOverS(SqStack &S) //判断栈是否为满
{
if (S.top==MAXSIZE-1)
return true;
else
return false;
}
status InSqStack(SqStack &S,int e) //进栈
{
if (IsOverS(S)) //栈满不进
return ERROR;
else
S.top=e;
S.top++;
}
status OutSqStack(SqStack &S,int &e) //出栈
{
if (S.top==-1) //栈空不出
return ERROR;
else
S.top--;
e=S.top;
}
void ReserveQueue(Queue &Q)
{
SqStack S;
int x;
InitSqStack(S);
while(!IsEmptyQ(Q))
{
OutQueue(Q,x);
InSqStack(S,x);
}
while(!IsEmptyS(S))
{
OutSqStack(S,x);
InQueue(Q,x);
}
}
void Makemenu()
{
printf("\t----------------[队列的逆置]---------\n");
printf("\t\t\t0.退出\n");
printf("\t\t\t1.入队\n");
printf("\t\t\t2.出队\n");
printf("\t\t\t3.逆置\n");
printf("\t--------------------------------------\n");
printf("请输入你的选择(0-3):\n");
}
void Key()
{
}
int main()
{
Makemenu();
int n;
Queue Q;
int x;
while(1){
scanf("%d",&n);
switch(n)
{
case 0:
exit(0);
system("pause");
break;
case 1:
printf("---------入队---------\n");
printf("请输入队列元素:",x);
scanf("%d",&x);
InQueue(Q,x);
break;
case 2:
printf("---------出队---------\n");
OutQueue(Q,x);
break;
case 3:
printf("---------逆置---------\n");
break;
default:
printf("输入有误请重新输入:");
}
printf("请输入你的选择:");
}
ReserveQueue(Q);
return 0;
}
想要实现利用辅助栈实现队列元素的逆置,编译器没有报错但出队和逆置都无法实现,请问问题出在哪里了呢?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- qzjhjxj 2022-04-03 10:23关注
修改处见注释,供参考:
#include <stdio.h> #include <windows.h> #define MAXSIZE 100 #define OK 1 #define ERROR 0 typedef struct //队列的定义 { char data[MAXSIZE]; int front; int rear; }Queue; typedef struct //栈的定义 { char data[MAXSIZE]; int top; }SqStack; typedef int status; status InitQueue(Queue& Q) //队列的初始化 { Q.front = Q.rear = 0; return OK; } bool IsEmptyQ(Queue& Q) //判断队列是否为空 { if (Q.front == Q.rear) return true; else return false; } bool IsOverQ(Queue& Q) //判断队列是否为满 { if ((Q.rear - Q.front) > MAXSIZE) //修改 //if (((Q.rear) % MAXSIZE) == Q.front) //这里就想到钟表来理解 return true; else return false; } status InQueue(Queue& Q, int x) //入队 { if (IsOverQ(Q)) //队满不入 return ERROR; else{ Q.data[Q.rear] = x; //修改 Q.rear++; } return OK; } status OutQueue(Queue& Q, int& x) //出队 { if (IsEmptyQ(Q)) //队空不出 return ERROR; else{ x = Q.data[Q.front]; //修改 //printf("%d\n", Q.front); Q.front++; } return OK; //修改 } status InitSqStack(SqStack& S) //初始化栈 { S.top = -1; return OK; } bool IsEmptyS(SqStack& S)//判断栈是否为空 { if (S.top == -1) return true; else return false; } bool IsOverS(SqStack& S) //判断栈是否为满 { if (S.top == MAXSIZE - 1) return true; else return false; } status InSqStack(SqStack& S, int e) //进栈 { if (IsOverS(S)) //栈满不进 return ERROR; else{ S.top++; //修改 S.data[S.top] = e; //修改 } return OK; //修改 } status OutSqStack(SqStack& S, int& e) //出栈 { if (S.top == -1) //栈空不出 return ERROR; else{ e = S.data[S.top]; //修改 S.top--; //修改 } return OK; //修改 } void ReserveQueue(Queue& Q) { SqStack S; int x; InitSqStack(S); while (!IsEmptyQ(Q)) { OutQueue(Q, x); InSqStack(S, x); } while (!IsEmptyS(S)) { OutSqStack(S, x); InQueue(Q, x); } } void Makemenu() { printf("\t----------------[队列的逆置]---------\n"); printf("\t\t\t0.退出\n"); printf("\t\t\t1.入队\n"); printf("\t\t\t2.出队\n"); printf("\t\t\t3.逆置\n"); printf("\t--------------------------------------\n"); printf("请输入你的选择(0-3):\n"); } void print(Queue* Q) //修改 { int i; for (i = Q->front; i < Q->rear; i++) printf("%d ", Q->data[i]); printf("\n"); } int main() { Makemenu(); int n, x; Queue Q; //修改 InitQueue(Q); SqStack S; //修改 InitSqStack(S); while (1) { scanf("%d", &n); switch (n) { case 0: exit(0); system("pause"); break; case 1: printf("---------入队---------\n"); printf("请输入队列元素:", x); scanf("%d", &x); InQueue(Q, x); break; case 2: printf("---------出队---------\n"); OutQueue(Q, x); break; case 3: printf("---------逆置---------\n"); ReserveQueue(Q); break; default: printf("输入有误请重新输入:"); break; } print(&Q); //修改 system("pause"); //修改 Makemenu(); //修改 printf("请输入你的选择:"); } return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 VB.NET2022如何生成发布成exe文件
- ¥30 matlab appdesigner私有函数嵌套整合
- ¥15 给我一个openharmony跑通webrtc实现视频会议的简单demo项目,sdk为12
- ¥15 vb6.0使用jmail接收smtp邮件并另存附件到D盘
- ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
- ¥15 关于freesurfer使用freeview可视化的问题
- ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
- ¥15 求SC-LIWC词典!
- ¥20 有关esp8266连接阿里云
- ¥15 C# 调用Bartender打印机打印