C 为什么使用两个堆栈的队列不起作用?
我正在尝试使用2个堆栈实现队列,但我的代码无法运行 你能发现错误吗C 为什么使用两个堆栈的队列不起作用?,c,stack,queue,C,Stack,Queue,我正在尝试使用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
#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);
}
#包括
#包括
#定义最大值5
typedef结构堆栈{
int top;
int-arr[MAX];
}堆叠;
无效元素(堆栈*s1,内部元素){
printf(“输入”);
推送(s1和s1,ele);
printf(“多么痛苦”);
}
无效推送(堆栈*s,内部元素){
如果(s->top==最大值-1){
printf(“溢出”);
}否则{
s->arr[++s->top]=ele;
}
}
int deq(堆栈*s1,堆栈*s2){
int x;
如果(s1->top==-1&&s2->top==-1){
printf(“空”);
}否则{
如果(s2->top==-1){
而(s1->top!=-1){
推送(&s2、弹出(&s1));
}
}
x=pop(&s2);
返回x;
}
}
int-pop(堆栈*s){
如果(s->top==-1){
printf(“下溢”);
}否则{
返回s->arr[s->top--];
}
}
无效显示(堆栈*s){
printf(“输入显示”);
int i;
对于(i=0;i top;i++){
printf(“%d”,s->arr[i]);
}
}
int main(){
int ch、ele、c;
堆栈s1、s2;
s1.top=-1,s2.top=-1;
做{
printf(“1-Enqueue2-deq3-display4-exit\n”);
printf(“输入选择”);
scanf(“%d”和“ch”);
开关(ch){
案例1:
printf(“输入您选择的元素”);
scanf(“%d”、&ele);
enque(&s1,ele);
打破
案例2:
c=deq(&s1和&s2);
printf(“%d”,c);
打破
案例3:
显示(&s1);
打破
案例4:
出口(0);
违约:
printf(“错误选择”);
}
}而(ch!=5);
}
你能发现错误吗
#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);
}
编译器可以比堆栈溢出更快地发现错误
OP未在启用所有警告的情况下编译,或正在使用弱编译器
启用所有警告以节省时间
intdeq(stack*s1,stack*s2)
和intpop(stack*s)
都有相同的问题
在这种情况下,一个常见的衰减是警告:控件到达非无效函数的末尾[-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.
您正在deque
和enque
函数中传递指针地址
push(&s2,pop(&s1));-->推(s2,弹出(s1));
x=pop(&s2);-->x=pop(s2);
推送(&s1,ele);-->推(s1,ele)代码>
因为s1
和s2
被接收为指向deque
和enque
函数的指针
还考虑了@的更改,考虑编译器警告,您可以自己解决所有问题。< /P>请正确地格式化代码,列出错误和所尝试的东西。这个问题是不可理解的。我是新来的,我不知道如何提交我的代码?你能告诉我怎么做吗?我删除了每行开头的
ender代码。然后我突出显示了您的代码并按下了文本框上方的{}按钮,以表明我选择的是代码而不是文本。请阅读关于如何发布问题的文档。我们不是来为你工作的。你的问题仍然无法回答。对不起,thnx..基本上,当我按下案例1时,我得到了一个分段错误,基本上是enque,它假设将一个元素推到堆栈1上,但我的s1顶部没有增加。它进入enque,然后由于推送,它假设将元素添加到s1上函数被调用,但它显示了分段错误。我纠正了u所说的所有错误,但它仍然没有将元素添加到stack@user10598529在帖子后面附加三件事:输入的数据、看到的结果和预期的结果。@user10598529“我纠正了所有错误”,不幸的是没有包括第一个修复:启用所有警告。否则您肯定会被警告使用push(&s1,ele)代码>。你能告诉我推送操作的错误吗?请详细说明我能详细说明第一点吗?你说了更多解释为什么我的代码是错误的,因为按照你在第一点中所说的做,我的代码就可以工作了。谈到在数据结构中使用指针,我有点困惑……还有第二点u写道,当我使enque更昂贵时,我们将其从堆栈2推回到另一个堆栈。如果我的DEQUE操作更昂贵,那么这是正确的方法,时间更短consuming@user10598529回答你的第一个问题。您从mainc=deq(&s1,&s2)传递s1和s2的地址代码>也就是说,您正在将它们作为指针传递。因此,deque中的intdeq(stack*s1,stack*s2)
s1和s2
是指针变量。执行此操作时,push(&s2,pop(&s1))
您正在传递s1和s2的地址,这是指向指针的指针。@user10598529回答您的第二个问题。没错。我完全误读了你的密码。你的方法很有效。