2010-06-13 29 views

Trả lời

6

Bạn sẽ cần phải làm điều đó bằng tay:

while (!stk.empty()) 
{ 
    deq.push_back(stk.top()); 
    stk.pop(); 
} 
+0

Ah, ok - cảm ơn. Chỉ cần tự hỏi nếu tôi có thể làm điều đó mà không cần phải tạo một bản sao của ngăn xếp, và popping nó vào một deque. – BeeBand

+5

@Stephen: Ngoại trừ 'deque' không có chức năng như vậy. :) – GManNickG

+0

@GMan: Holy crap, bạn nói đúng. Làm cho tinh thần, cho rằng bạn sẽ không biết cách nào để phát triển nó. Tôi đoán bạn có thể tạo ra deque với 'std :: deque deq (stk.size());', nhưng sau đó bạn không thể sử dụng 'push_back'. – Stephen

3

Bạn cần phải bật tất cả các yếu tố ra khỏi ngăn xếp và vào một container khác nhau.

Nếu bạn cần làm điều này, có lẽ std::stack là cấu trúc dữ liệu sai cho trường hợp sử dụng của bạn.

+0

Vâng - nó để tôi có thể so sánh ngăn xếp. Hàm 'equal' trong lib chuẩn, cần một thùng chứa các hàm' begin() 'và' end() '. Và tôi cần phải dễ dàng nhìn thấy đảo ngược của ngăn xếp của tôi là tốt, vì vậy tôi nghĩ về việc chuyển đổi chúng để deques. – BeeBand

+2

@BeeBand: Tại sao không chỉ sử dụng 'std :: deque' thay vì' std :: stack'? Nó có thể được sử dụng cho cùng một mục đích, thay vì 'top()', 'push()', và 'pop()', bạn cần sử dụng 'back()', 'push_back()' và 'pop_back() '. –

+0

@James - vì cửa sổ bật lên, giao diện đẩy rất hữu ích. Tôi cần chức năng 'stack' (tức là' push', 'pop', và' top') và không muốn gọi 'push_back()' hoặc 'pop_back()'. – BeeBand

2

Tôi nghĩ nếu bạn cần điều này, bạn sẽ tốt hơn khi sử dụng deque ngay từ đầu, thay vì ngăn xếp. Không có cách nào nhận được ở lưu trữ cơ bản được sử dụng bởi bộ điều hợp ngăn xếp, nếu đó là những gì bạn đang yêu cầu.

+0

@Neil, đó là chính xác những gì tôi đã hỏi có. Tôi hiểu rồi. tốt. Giao diện ngăn xếp phù hợp với nhu cầu của tôi - chỉ cần tôi có thể so sánh các mục trong ngăn xếp. – BeeBand

+0

@BeeBand Thực sự, một deque khá nhiều công trình như một chồng anyway - bạn chỉ cần nói pop_front và push_back thay vì pop và đẩy. –

+0

@Neil - điều này đúng. Tôi chỉ thích các tên hàm nhỏ, và ý tưởng của 'back' và' front' khiến mọi thứ trở nên khó hiểu với những gì tôi đang làm. – BeeBand

15

Có thể truy cập vào vùng chứa bên dưới mà không cần sao chép dữ liệu, nhưng nó đòi hỏi một số lượng nhất định của cái ác. Các container được tiếp xúc như một thành viên bảo vệ, được gọi là c, cho phép tinh quái như thế này:

template <typename T> 
class Shenanigans : private stack<T> 
{ 
public: 
    explicit Shenanigans(stack<T>& victim) : victim(victim) 
    { 
     swap(victim); 
    } 

    ~Shenanigans() 
    { 
     swap(victim); 
    } 

    using stack<T>::c; 

private: 
    stack<T>& victim; 
}; 

int main() 
{ 
    stack<int> s; 
    s.push(42); 

    { 
     Shenanigans<int> sh(s); 
     // The deque is accessible as sh.c, but the stack is temporarily empty. 
     cout << "Size: " << s.size() << " Data: " << sh.c.front() << "\n"; 
    } 

    // The stack is restored. 
    cout << "Size: " << s.size() << " Data: " << s.top() << "\n"; 
} 

Tất nhiên một giải pháp xa, xa hơn là chọn một container đáp ứng nhu cầu của bạn.

+2

+1: Tôi không biết rằng nó được yêu cầu container phải được lưu trữ như một thành viên được bảo vệ có tên 'c'. –

+1

+1 cho giải pháp tà ác – piotr

Các vấn đề liên quan