Почему мой код C ++ для печати максимального элемента в стеке не дает правильного вывода? - PullRequest
0 голосов
/ 07 мая 2020

Я работаю над упражнением по программированию Максимальный элемент (https://www.hackerrank.com/challenges/maximum-element/problem?isFullScreen=false) с использованием C ++, цель упражнения - напечатать максимальное количество элементов для каждого запроса типа 3. Каждый запрос относится к одному из этих трех типов:

  1. Pu sh элемент x в стеке.

  2. Удалить элемент, присутствующий в верх стека.

  3. Вывести максимальный элемент в стеке.

Для входных данных:

10
1 97
2
1 20
2
1 26
1 20
2
3
1 91
3

Ожидается Вывод:

26
91

Мой код печатается:

0
0

Мой код (написанный ниже) явно печатает неправильный ответ, однако я не могу узнать, где я сделал ошибка. Как я могу решить эту проблему или отладить мою ошибку?

#include<iostream>
#include<stack>
using namespace std;
int main() {
    int n;
    cin>>n;

    while(n--)
    {
        stack<int> s;
        int a;

        cin>>a;

        if(a==1)
        {
            int x;
            cin>>x;
            s.push(x);

        }
        else if (a==2)
        s.pop();

        else {
        int max =0;
        while(!s.empty())
        {
            if(s.top()>max)
            max=s.top();

            s.pop();

        }
        cout<<max<<endl;
        }
    }   
    return 0;
}

Ответы [ 3 ]

1 голос
/ 07 мая 2020

Вы объявили стек stack<int> s; внутри l oop, поэтому он будет очищаться в каждом начале l oop. Объявление должно быть снаружи l oop как

stack<int> s; // move here, for example
int n;
cin>>n;
while(n--)
{
    // stack<int> s;

Это изменение сделает вывод для ввода здесь правильным, но я не думаю, что программа верна только это изменение. Я не думаю, что запрос типа 3 должен удалять элементы в стеке.

0 голосов
/ 08 мая 2020

1) объявил стек вне цикла 2) ранее элементы выскакивали для поиска максимального элемента, поэтому был создан другой стек для отслеживания максимального элемента

Новый код прошел все тестовые примеры : -

#include <iostream>
#include <stack>
using namespace std;
int main() {
  stack<int> s, max;
  max.push(0);
  int n;
  cin >> n;
  while (n--) {
    int a;
    cin >> a;
    if (a == 1) {
      int x;
      cin >> x;
      s.push(x);
      if (x >= max.top())
        max.push(x);
    } else if (a == 2) {
      int q = s.top();
      if (q == max.top())
        max.pop();
      s.pop();
    } else {
      cout << max.top() << endl;
    }
  }
  return 0;
}
0 голосов
/ 08 мая 2020

Вы объявили стек внутри l oop, который при каждом увеличении или уменьшении в данном случае будет возвращать значение в исходное состояние.

Быстрое решение - просто объявить стек за пределами вашего l oop, а остальной код будет выглядеть нормально.

...