Trang 2 trên tổng số 5 Đầu tiênĐầu tiên 1234... Cuối cùngCuối cùng
Từ 11 tới 20 trên tổng số 49 kết quả

Đề tài: Ngăn xếp và hàng đợi (Stack and Queue) - Nguyên tắc và cài đặt trên C++

  1. #11
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Ngăn xếp và hàng đợi (Stack and Queue) - Nguyên tắc và cài đặt trên C++

    - Khi dùng delete trong C++ cho pointer bản thân nội dung nó bị delete không có nghĩa là địa chỉ mà nó trỏ tới không còn hiệu lực, đó là vì sao khi dùng delete thì ngay sau đó phải set nó to NULL.
    - NewItem là 1 con trỏ ở địa chỉ khác Item, voidmain() dùng nó trỏ vào NewItem tức là nó vẫn hiệu lực, lúc này cả Item và NewItem đều trỏ vào vùng nhớ mà NewItem mới tạo ra. Memory không leak nhưng cả 2 con trỏ đang trỏ vào 1 vùng nhớ và lỗi này thực sự rất nguy hiểm, trong code trên thì hoàn toàn không sinh bug, nhưng nếu ở 1 tình huống khác thì không biết chuyện gì sẽ xảy ra.

  2. #12
    Ngày gia nhập
    10 2007
    Nơi ở
    /root
    Bài viết
    318

    Ok, tớ đã hiểu trường hợp này , giờ tớ đi học , có gì tối về xử lý sau .
    Có khi gán lại NewItem = NULL là xong nhỉ ?
    What you see is never what you get...

  3. #13
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Ví dụ này ok, nhưng không chấp nhận được :
    C++ Code:
    1. #include <iostream>
    2.  
    3. using namespace std;
    4.  
    5. int main()
    6. {
    7.     int* o = new int[ 5 ];
    8.  
    9.     delete[] o;
    10.  
    11.  
    12.     int* ptr = new int[ 5 ];
    13.     o = ptr;
    14.     for( int i = 0; i < 5; ++i )
    15.     {
    16.         ptr[ i ] = 1;
    17.     }
    18.  
    19.     for( int i = 0; i < 5; ++i )
    20.     {
    21.         cout << o[ i ] << " ";
    22.         cout << ptr[ i ] << " ";
    23.     }
    24.  
    25.     delete[] ptr;
    26.    
    27.     return 0;
    28. }

    Ừ, gán NULL là chính xác, không cần phải tạo ra con trỏ mới làm gì, thừa và nguy hiểm, chỉ cần khởi tạo lại cho Item là ok !

  4. #14
    Ngày gia nhập
    08 2008
    Nơi ở
    homeless
    Bài viết
    15

    Đọc trong "C++ How To Program" (anh 2R giới thiệu) thấy có đoạn này
    Code:
    delete [] ptr;
    ptr=0;
    là trường hợp này đúng kô,em thấy đa số chỉ có delete thôi.

  5. #15
    Ngày gia nhập
    04 2008
    Bài viết
    336

    còn đây là stack làm bằng DSLK đang tập viết theo STL có chỗ nào cần sửa lại mong các bạn chỉ thêm
    C++ Code:
    1. #include <iostream>
    2.  
    3. using namespace std;
    4.  
    5. template<class T>class Stack;
    6.  
    7. template<class T>
    8. class Node
    9. {
    10.     private:
    11.         Node<T> *next;
    12.         T data;
    13.     public:
    14.     Node()
    15.     {
    16.         next=NULL;
    17.     }
    18.     ~Node()
    19.     {
    20.         next=NULL;
    21.         delete next;
    22.     }
    23.     //Node(Node<T>const &m);
    24.     //Node<T>& operator = (Node<T> const &m);
    25.     friend class Stack<T>;
    26. };
    27.  
    28. /*template<class T>
    29. Node<T>::Node(Node<T>const &m)
    30. {
    31.     data=m.data;
    32.     next=m.next;
    33. }
    34.  
    35. template<class T>
    36. Node<T>& Node<T>::operator=(Node<T> const &m)
    37. {
    38.     data=m.data;
    39.     next=m.next;
    40.     return *this;
    41. }*/
    42.  
    43. template<class T>
    44. class Stack
    45. {
    46.     private:
    47.         Node<T> *top;
    48.     public:
    49.     Stack();
    50.     ~Stack();
    51.     void push(T const &d);
    52.     void pop(T &topdata);
    53.     void print() const;
    54.     bool empty() const;
    55.     Stack(const Stack<T> &S);
    56.     Stack<T> &operator=(const Stack<T> &S);
    57. };
    58.  
    59. template<class T>
    60. Stack<T>& Stack<T>::operator=(const Stack<T> &S)
    61. {
    62.     top=NULL;
    63.     Node<T> *p,*a,*i;
    64.     p=S.top;
    65.     while(p)
    66.     {
    67.         a=new Node<T>;
    68.         a->data=p->data;
    69.         a->next=NULL;
    70.         if(top)
    71.         {
    72.             i=top;
    73.             while(i->next)i=i->next;
    74.             i->next=a;
    75.         }
    76.         else top=a;
    77.         p=p->next;
    78.     }
    79.     return *this;
    80. }
    81.  
    82. template<class T>
    83. Stack<T>::Stack(const Stack<T> &S)
    84. {
    85.     top=NULL;
    86.     Node<T> *p,*a,*i;
    87.     p=S.top;
    88.     while(p)
    89.     {
    90.         a=new Node<T>;
    91.         a->data=p->data;
    92.         a->next=NULL;
    93.         if(top)
    94.         {
    95.             i=top;
    96.             while(i->next)i=i->next;
    97.             i->next=a;
    98.         }
    99.         else top=a;
    100.         p=p->next;
    101.     }
    102. }
    103.  
    104. template<class T>
    105. Stack<T>::Stack()
    106. {
    107.     top=NULL;
    108. }
    109.  
    110. template<class T>
    111. Stack<T>::~Stack()
    112. {
    113.     Node<T> *p;
    114.     while(top)
    115.     {
    116.         p=top;
    117.         top=top->next;
    118.         delete p;
    119.     }
    120.     delete top;
    121. }
    122.  
    123. template<class T>
    124. void Stack<T>::push(T const &d)
    125. {
    126.     Node<T> *a= new Node<T>;
    127.     a->data=d;
    128.     a->next=top;
    129.     top=a;
    130. }
    131.  
    132. template<class T>
    133. void Stack<T>::pop(T& topdata)
    134. {
    135.     if(!empty())
    136.     {
    137.         Node<T> *p;
    138.         p=top;
    139.         top=top->next;
    140.         topdata=p->data;
    141.         delete p;
    142.     }
    143.     else
    144.         cout<<"Stack is empty\n";
    145. }
    146.  
    147. template<class T>
    148. bool Stack<T>::empty() const
    149. {
    150.     return top==NULL;
    151. }
    152.  
    153. template<class T>
    154. void Stack<T>::print() const
    155. {
    156.     Node<T> *p;
    157.     p=top;
    158.     while(p)
    159.     {
    160.         cout<<p->data<<" ";
    161.         p=p->next;
    162.     }
    163.     cout<<endl;
    164. }
    165.  
    166. int main(int argc, char *argv[])
    167. {
    168.     int x;
    169.     Stack<int> S;
    170.     for(int i=0;i<10;++i)S.push(i);// push 0 1 2 3 4 5 6 7 8 9
    171.     S.print();      //last in first out => 9 8 7 6 5 4 3 2 1 0
    172.     Stack<int> B(S);//copy constructor;
    173.     Stack<int> C;
    174.     Stack<int> A=C=B;//operator =
    175.     A.print();
    176.     B.pop(x);
    177.     B.print();
    178.     C.print();
    179.     return 0;
    180. }
    Đã được chỉnh sửa lần cuối bởi 6220119 : 24-09-2008 lúc 10:21 AM.
    code ra gió bão

  6. #16
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Ngăn xếp và hàng đợi (Stack and Queue) - Nguyên tắc và cài đặt trên C++

    Set pointer sau khi delete tới NULL là 1 thói quen tốt, giống như tui viết code bao giờ tui viết chữ new xuống là tui comment kế bên /* missing one delete */, naked pointer như new rất nguy hiểm vì khi xử lý pointer nested trong cấu trúc dữ liệu( chẳng hạn như LinkedList hay BinaryTree ) ngay cả thầy tui mà đôi khi ổng kêu có lúc ổng tìm ra có lúc ổng cũng potay, debugger là 1 chuyện, kinh nghiệm và thói quen tốt trong design cũng giúp rất nhiều !

  7. #17
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    - Internal của STL là double linked list và có nested class iterator, nhưng cậu chẳng cần quan tâm đến nó lúc này làm gì vì nó cũng khá phức tạp.
    - Tui có thói quen khi viết node list thì 1 là tui dùng nested bên trong class Stack hoặc tui cho Stack làm friend. Vì cậu để struct Node <> standalone thì tính encapsulation không cao, vì cơ bản tui vẫn có thể khởi tạo được 1 Node trong main().
    C++ Code:
    1. template<class T>
    2. T& Stack<T>::pop()
    3. {
    4.     if(!empty())
    5.     {
    6.         T t;
    7.         Node<T> *p;
    8.         p=top;
    9.         top=top->next;
    10.         t=p->data;
    11.         delete p;
    12.         return t;
    13.     }
    14.     cout<<"Stack is empty\n";
    15. }
    - Hàm này nếu nó empty thì không trả về gì được à ?
    - Copy constructor, overloading operator = đâu ?

  8. #18
    Ngày gia nhập
    04 2008
    Bài viết
    336

    quên ... em đang tập viết theo chuẩn thì đúng hơn
    - Hàm này nếu nó empty thì không trả về gì được à ?
    yeah em cũng bí chỗ đó... vì T là 1 kiểu được định nghĩa sẵn nên ko biết nếu empty thì làm cách nào thoát khỏi hàm mà ko return về giá trị
    Copy constructor, overloading operator = đâu
    cái này em nghĩ là làm trong các class T chứ ... còn nếu là gán 2 stack cho nhau thì... lát nữa em bổ sung
    code ra gió bão

  9. #19
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    yeah em cũng bí chỗ đó... vì T là 1 kiểu được định nghĩa sẵn nên ko biết nếu empty thì làm cách nào thoát khỏi hàm mà ko return về giá trị
    Vậy thì suy nghĩ design sao cho chỗ này nó hợp lý hơn xem ! Sao không dùng 1 hàm đại loại như retrieve( T& giá_trị_top ), sau khi gọi top thì thằng giá trị top đó có 1 giá trị nào đó chẳng hạn.

  10. #20
    Ngày gia nhập
    04 2008
    Bài viết
    336

    Tui có thói quen khi viết node list thì 1 là tui dùng nested bên trong class Stack hoặc tui cho Stack làm friend. Vì cậu để struct Node <> standalone thì tính encapsulation không cao, vì cơ bản tui vẫn có thể khởi tạo được 1 Node trong main().
    anh RR cho em hỏi thêm chỗ này ... ý anh là nên làm thêm 1 class Node nữa ?
    code ra gió bão

Các đề tài tương tự

  1. Trả lời: 0
    Bài viết cuối: 20-05-2011, 10:39 PM
  2. Bài tập C++ Sử dụng cấu trúc dữ liệu Queue thực hiện trên DSLK ĐƠN để lưu trữ 1 dãy các số nguyên
    Gửi bởi kaner1111 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 18-05-2011, 10:42 AM
  3. Stack, ngăn xếp - Thiết lập và ứng dụng stack trong C
    Gửi bởi PoPoPoPo trong diễn đàn Thủ thuật, Tutorials CTDL & Giải thuật
    Trả lời: 8
    Bài viết cuối: 15-11-2010, 11:24 PM
  4. Nhược điểm của ngăn xếp stack trên C?
    Gửi bởi gianghien1404 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 26
    Bài viết cuối: 24-07-2010, 12:45 PM
  5. Stack và Queue trên C++. Mọi người cùng góp ý nhé!
    Gửi bởi hoangedward trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 7
    Bài viết cuối: 29-03-2010, 08:44 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn