Почему очередь, использующая два стека, не работает? - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь реализовать очередь, используя 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);
}

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Вы передаете адрес указателя в deque и enque функциях.

push(&s2, pop(&s1)); --> push(s2, pop(s1)); x = pop(&s2); --> x = pop(s2); push(&s1, ele);-->push(s1, ele);

, поскольку s1 и s2 получены как указатели на deque и enque функции


Также рассмотрите изменения, предложенные @ Mr.Chux , учитывая предупреждения компилятора, что вы могли бы решить все проблемы самостоятельно.

0 голосов
/ 03 ноября 2018

Можете ли вы определить ошибку?

Компилятор может обнаружить ошибку быстрее, чем переполнение стека.

OP не компилируется со всеми включенными предупреждениями или использует слабый компилятор

Включить все предупреждения, чтобы сэкономить время.


int deq(stack*s1, stack*s2) и int pop(stack *s) имеют одинаковую проблему.

Обычное уменьшение в таких случаях warning: control reaches end of non-void function [-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.
...