将队列中元素逆序后,为何打印出来的还是原来的顺序?
描述:Q是一个队列,S是一个空栈,实现将队列中的元素逆置
实现程序如下:
#include <stdio.h>
#define MaxSize 100
//定义栈结构
typedef struct{
int data[MaxSize];
int top;
}Stack;
//定义队列结构
typedef struct {
int data[MaxSize];
int front, rear;
}Queue;
//初始化队列
void InitQueue(Queue &Q) {
Q.front = Q.rear = 0;
printf("循环队列初始化成功\n");
}
//判空
bool QueueEmpty(Queue Q) {
if(Q.front == Q.rear) {
return true;
}else {
return false;
}
}
//入队
bool EnQueue(Queue &Q, int &e) {
//判断队列是否满,可以通过队尾指针的下一个位置就是队头来判断
if((Q.rear + 1) % MaxSize == Q.front) {
printf("队列已经满了,%d不能再入队\n", e);
return false;
}
//在队列尾部入队
Q.data[Q.rear] = e;
printf("入队列的元素: %d\n", e);
Q.rear = (Q.rear + 1) % MaxSize; //队尾指针加1取模
return true;
}
//出队
int DeQueue(Queue &Q, int &x) {
if(Q.rear == Q.front) {
return 0; //队列为空,不能再出队了
}
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize;
return x;
}
//初始化栈
void InitStack(Stack &S) {
S.top = -1;
printf("顺序栈初始化成功\n");
}
bool StackEmpty(Stack S) {
if(S.top == -1) { //判断栈空
return true;
}else {
return false;
}
}
void Push(Stack &S, int &x) {
if(S.top == MaxSize-1 ) {
printf("顺序栈已经满了,无法进栈\n");
}
printf("\n入栈元素: %d\n", x);
S.data[++S.top] = x;
}
int Pop(Stack &S, int &x) {
if(S.top == -1) {
printf("栈已经空了,不能出栈\n");
}
x = S.data[S.top--];
printf("\n出栈元素: %d\n", x);
return x;
}
//打印队列中的元素
void printQueue(Queue Q) {
while(!QueueEmpty(Q)) {
printf("%3d", Q.data[Q.front]);
Q.front = (Q.front + 1) % MaxSize;
}
}
//逆序过程
int Inverser(Stack S, Queue Q) {
if( Q.front == Q.rear || (Q.rear - Q.front + MaxSize) % MaxSize == 1) { //队列中只有0或一个元素
printf("\n不需要逆置\n");
return 0;
}
int x;
while(!QueueEmpty(Q)) {
DeQueue(Q, x); //将队列中的元素依次出队
Push(S, x); //再全部Push进入栈中
}
while(!StackEmpty(S)) {
Pop(S, x); //将栈中元素全部出栈
EnQueue(Q, x); //再将出栈的元素依次进队
}
return 1;
}
int main() {
Stack S;
Queue Q;
InitQueue(Q);
InitStack(S);
if(QueueEmpty(Q)) { //返回true
printf("该循环队列为空\n");
}else {
printf("该循环队列不空\n");
}
int e;
printf("请输入想要入队的元素,以负数作为结束输入: ");
while(scanf("%d", &e)) {
if(e < 0) {
break;
}
EnQueue(Q, e);
}
printf("\n输入的队列元素顺序为:\n");
printQueue(Q);
//逆序
if(Inverser(S, Q)) {
printf("\n逆序后队列元素顺序为:\n");
printQueue(Q);
}
}
执行后的截图:
可以看到,先是1,2,3入队,然后依次出队再入栈,入栈顺序是1,2,3,然后从栈中Pop后再入队,顺序是3,2,1. 此时入队依次是:3,2,1. 队首是3,队尾是1,可是为什么再次打印出来的顺序结果依然还是:1,2,3 ?
不明白哪里出问题了,逆序后为什么打印的还是1,2,3?求帮助解答,谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)