Code về hàng đợi (Queue) chạy sai với n lớn (khoảng 100000)

Em/ mình có bài tập này
Cho một dãy số A, bạn có thể thực hiên 3 loại lệnh sau với dãy số.

  • 1 x : Thêm phần tử xx vào cuối dãy số.
  • 2 : Xóa phần tử đầu tiên của dãy số.
  • 3 : In ra phần tử đầu tiên của dãy số.

Viết chương trình thực hiện N truy vấn trên dãy số A. Ban đầu dãy số A không chứa phần tử nào.
Dữ liệu vào gồm nhiều dòng từ bàn phím:

  • Dòng thứ nhất chứa số nguyên NN.
  • NN dòng tiếp theo, mỗi dòng tương ứng với một trong 3 loại lệnh như trê.
  • (N≤10^5, x≤10^9)

Với mỗi lệnh loại 3 , in ra màn hình phần tử đầu tiên trong dãy số.
Tại sao code của mình chạy sai với n rất lớn (khoảng 100000).

#include <iostream>
#include <queue>
#include <string>
using namespace std;
queue<int> q;
main()
{
    int n; cin >> n;
    string s;
    while(n-->0)
    {
        fflush(stdin);
        getline(cin, s);
        if(s[0]=='1'){
            q.push(stoi(s.substr(2, s.size()-1)));
        }
        if(s[0]=='2'){
            q.pop();
        }
        if(s[0]=='3'){
            cout << q.front() << endl;
        }
    }
    return 0;
}

Bỏ fflush(stdin) đi. Thay vào đó thêm cin.ignore() vào bên cạnh cin >> n.

2 Likes

tại sao lại thế hả anh, anh giải thích cho e với

fflush(stdin) không có nghĩa lí gì cả.

Sau khi nhập n, ấn enter (đã đọc xong n) thì trong buffer còn kí tự \n. cin.ignore() bỏ qua kí tự thừa này, đưa con trỏ đọc của cin xuống dòng mới.

1 Like

case n=10000 của e thì vẫn đúng, nhưng còn 100000 thì output lệch nhau đúng một dòng.
E chưa hiểu tại sao lại thế. Với cả fflush(stdin) e tưởng xóa đc bộ nhớ đệm, ban đầu e để sau cin >> n cũng được

Lệch nhau như thế nào?

1 Like


Như này a
Thứ tự như thế nhưng nó thêm một dòng 768745938 rồi đẩy xuống

Bạn đổi sang đọc từng số query, rồi nếu query = 1 thì đọc thêm số x để tránh đọc xâu lôi thôi.

while (n--) {
    cin >> query;
    if (query == 1) {
        cin >> x;
        // code
    } else
    // code tiếp theo
}
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?