gpt4 book ai didi

c - 为什么使用两个堆栈的队列不起作用?

转载 作者:行者123 更新时间:2023-11-30 20:30:51 26 4
gpt4 key购买 nike

我正在尝试使用 2 个堆栈实现队列,但我的代码无法运行。

你能发现错误吗?

#include <stdio.h>
#include<stdlib.h>
#define MAX 5

typedef struct stack {
int top;
int arr[MAX];
} stack;

void enque(stack*s1, int ele) {
printf("entering");
push(&s1, ele);
printf("what a pain");
}

void push(stack*s, int ele) {
if (s->top == MAX - 1) {
printf("OVERFLOW");
} else {
s->arr[++s->top] = ele;
}
}

int deq(stack*s1, stack*s2) {
int x;
if (s1->top == -1 && s2->top == -1) {
printf("empty");
} else {
if (s2->top == -1) {
while (s1->top != -1) {
push(&s2, pop(&s1));
}
}
x = pop(&s2);
return x;
}
}

int pop(stack *s) {
if (s->top == -1) {
printf("UNDERFLOW");
} else {
return s->arr[s->top--];
}
}

void display(stack*s) {
printf("entered display");
int i;
for (i = 0; i <= s->top; i++) {
printf(" %d", s->arr[i]);
}
}

int main() {
int ch, ele, c;
stack s1, s2;
s1.top = -1, s2.top = -1;
do {
printf("1 - Enqueue2-deq3-display4-exit\n");
printf("Enter choice");
scanf("%d", &ch);
switch (ch) {
case 1:
printf("enter ele of ur choice");
scanf("%d", &ele);
enque(&s1, ele);
break;
case 2:
c = deq(&s1, &s2);
printf("%d", c);
break;
case 3:
display(&s1);
break;
case 4:
exit(0);
default:
printf("Wrong choice");
}
} while (ch != 5);
}

最佳答案

Can you spot the error?

编译器可以比堆栈溢出更快地发现错误。

OP 未在启用所有警告的情况下进行编译,或者使用的编译器较弱

启用所有警告以节省时间。

<小时/>

int deq(stack*s1, stack*s2)int pop(stack *s) 都有同样的问题。

在这种情况下,常见的警告是警告:控制到达非 void 函数的末尾 [-Wreturn-type]

确保每个函数路径返回一个值。

int pop(stack *s) {
if (s->top == -1) {
printf("UNDERFLOW"); // Notice, no return
} else {
return s->arr[s->top--];
}
}
<小时/>

还可以在声明之前使用push(&s1, ele);。这会导致函数签名发生冲突。使用前声明或定义push()。可能未定义的行为 (UB),这使得代码不可靠。

<小时/>

我建议更频繁地打印 '\n'

// printf("entering");
printf("entering\n");
// or
puts("entering"); // \n automatically added.

关于c - 为什么使用两个堆栈的队列不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53128628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com