Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Thắc mắc cơ bản về Stack

  1. #1
    Ngày gia nhập
    11 2011
    Bài viết
    0

    Mặc định Thắc mắc cơ bản về Stack

    Không biết phần Cấu trúc dữ liệu này nên post ở đâu nên em mạn phép post bài ở đây.Bài tập khá đơn giản như là viết các hàm push,pop của Stack.nhưng không hiểu sao chương trình compile không thấy lỗi (mình xài VS 2010) nhưng cái hàm inserthead có vấn đề,nó cho nhập vào nhưng không tạo ra node mới nên địa chỉ phead và ptail luôn bằng NULL.em không biết phải giải quyết vấn đề này làm sao ?

    file thư viện
    C++ Code:
    1. struct node
    2. {
    3.     int data;
    4.     struct node* pnext;
    5. };
    6. node* createnode(int value);
    7. class Stack
    8. {
    9. private:
    10.     node *phead;
    11.     node *ptail;
    12. public:
    13.         Stack();
    14.     node* inserthead(int x);
    15.     int removehead();
    16.     bool isEmpty();
    17.     void Push,int x);
    18.     int Pop();
    19.     void print();
    20. };


    file CPP
    C++ Code:
    1. #include <iostream>
    2. #include "Stack.h"
    3. using namespace std;
    4.  
    5. node* createnode(int value)            //khởi tạo 1 node mới
    6. {
    7.     node*cur;
    8.     cur=new node;
    9.     if(cur==NULL)
    10.         return NULL;
    11.     cur->data=value;
    12.     cur->pnext=NULL;
    13.     return cur;
    14. }
    15. /////////////////////////////////
    16.  Stack::Stack()                                //hàm constructor
    17. {
    18.     phead=ptail=NULL;
    19. }
    20.  
    21.  bool Stack::isEmpty()                       //hàm kiểm tra Stack có rỗng hay không
    22.  {
    23.      if(phead==NULL)
    24.          return 1;
    25.      else
    26.          return 0;
    27.  }
    28. /////////////////////////////////
    29. node* Stack::inserthead(int x)            //hàm chèn phần tử vào đầu Stack
    30. {
    31.     node*new_node= createnode(x);
    32.     if (new_node=NULL)
    33.         return NULL;
    34.     if(phead==NULL)
    35.     {
    36.         phead=new_node;
    37.         ptail=phead;
    38.     }
    39.     else
    40.     {
    41.         new_node->pnext=phead;
    42.         phead=new_node;
    43.     }
    44.     return new_node;
    45. }
    46.  
    47. void Stack::Push(int x)
    48. {
    49.     inserthead(x);                            //hàm Push
    50. }
    51. /////////////////////////////////
    52. int Stack::removehead()                      //hàm hủy phần tử đầu
    53. {
    54.     node* p;
    55.     int x=NULL;
    56.     if(phead!=NULL)
    57.     {
    58.         p=phead;
    59.         x=p->data;
    60.         phead=phead->pnext;
    61.         delete p;
    62.         if(phead=NULL)
    63.             ptail=NULL;
    64.     }
    65.     return x;
    66. }
    67.  
    68. int Stack::Pop()                                 //hàm Pop
    69. {
    70.     int x;
    71.     if(isEmpty()==1)
    72.         return NULL;
    73.     else
    74.         x=removehead();
    75.     return x;
    76. }
    77. /////////////////////////////////
    78. void Stack::print()                                //hàm in ra các giá trị
    79. {
    80.     node *cur;
    81.     cur = phead;
    82.     while (cur != NULL)
    83.     {
    84.         cout<<cur->data<<"  ";
    85.         cur = cur->pnext;
    86.     }
    87. }

    và đây là file main
    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3. #include <sstream>
    4. #include "Stack.h"
    5. using namespace std;
    6.  
    7. void main()
    8. {
    9.     Stack S;
    10.     string a;
    11.     int x;
    12.     cout<<"Input number to linked list (press '#' to exit) : "<<endl;        //nhập liên tục đến khi nhấn #
    13.     while(1)                                                   //vòng lặp vô hạn
    14.     {
    15.         cout<<"Enter a number : ";
    16.         cin>>a;                                           //mình nhập các giá trị dưới kiểu string
    17.         if(a=="#")                                        //nếu thấy ký tự # thì break
    18.             break;
    19.         istringstream i(a);                             //hàm đổi kiểu string thành kiểu int
    20.         i>>x;                                              //nhập lại dưới dạng số nguyên x
    21.         S.Push(x);                                       //hàm chèn phần tử vào Stack
    22.     }
    23.     cout<<"Data was input : "<<endl;
    24.     S.print();                                                  //in các phần tử trong linked lít
    25.     S.Pop();                                                 //hàm Pop
    26.     int u;cin>>u;
    27. }
    Đã được chỉnh sửa lần cuối bởi nntrungduy : 14-03-2012 lúc 07:57 PM.

  2. #2
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Một lỗi cơ bản của các bạn mới học
    C++ Code:
    1. node* Stack::inserthead(int x)            //hàm chèn phần tử vào đầu Stack
    2. {
    3.     node*new_node= createnode(x);
    4.     if (new_node=NULL) // Dấu = hay dấu == ?
    Đã được chỉnh sửa lần cuối bởi clchicken : 15-03-2012 lúc 11:46 AM. Lý do: Chỉ nhầm người
    Um Mani Padme Hum...!!

  3. #3
    Ngày gia nhập
    11 2011
    Bài viết
    0

    _ hihi,chỗ đó gõ thiếu.thank bạn
    _còn hàm inserthead là hàm tạo 1 node vào đầu danh sách nên giá trị trả về phải trả về node đó,sau đó hàm Push ở dưới mình gọi hàm inserthead vào nên để nó là void.không biết có gì sai không nhưng code mình dựa vào cuốn sách "Cấu trúc dữ liệu và giải thuật" của thầy Dương Anh Đức viết ,mới học lần đầu nên còn nhiều sai sót,nhưng cũng ở chỗ cái hàm ấy có vấn đề mà mình không thể nhập giá trị của 1 node vào được,mong bạn chỉ giùm mình
    Đã được chỉnh sửa lần cuối bởi nntrungduy : 14-03-2012 lúc 10:05 PM.

  4. #4
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Bạn nên đọc lại bài mình 1 tí, mình vừa bổ sung các ý thêm vào(nhất là ý cuối)

    Nói thêm
    còn hàm inserthead là hàm tạo 1 node vào đầu danh sách nên giá trị trả về phải trả về node đó,sau đó hàm Push ở dưới mình gọi hàm inserthead vào nên để nó là void
    Đã inserthead rồi thì push làm gì ? mà đã pop rồi thì inserthead làm gì ? 2 hàm làm cùng 1 công việc ah ? Hàm push gọi tới hàm inserthead 1 cách trống trải, không làm gì hơn ? Vậy việc gì phải đẻ ra thêm cái Push gì nữa ?
    Tương tự cho removehead và pop

    Còn cái lý luận "thêm 1 node vào stack mà trả về node đó là lý luận bậy.
    Trả về để làm gì khi phần tử đó ta đang nắm giữ, ta đang kiểm soát nó ?
    Ví dụ int Ham(int x) { return x; } hàm này trả về x để lam gì ? Khi x ta đang kiểm soát ? Có phải thừa thải không ?
    Đã được chỉnh sửa lần cuối bởi clchicken : 14-03-2012 lúc 10:13 PM.
    Um Mani Padme Hum...!!

  5. #5
    Ngày gia nhập
    11 2011
    Bài viết
    0

    Trích dẫn Nguyên bản được gửi bởi clchicken Xem bài viết
    Bạn nên đọc lại bài mình 1 tí, mình vừa bổ sung các ý thêm vào(nhất là ý cuối)

    Nói thêm

    Đã inserthead rồi thì pop làm gì ? mà đã pop rồi thì inserthead làm gì ? 2 hàm làm cùng 1 công việc ah ?
    Tương tự cho removehead và pop

    Còn cái lý luận "thêm 1 node vào stack mà trả về node đó là lý luận bậy.
    hàm pop là hàm lấy 1 phần tử ra thì đâu có liên quan gì đến thêm 1 phần tử ???cái lý luận kia thì mình chỉ hiểu theo cách nghĩ của mình,mong bạn giúp mình hiểu thêm

  6. #6
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Mặc định Thắc mắc cơ bản về Stack

    Nhầm, insert và Push
    Đã sửa và bổ sung vài ý ở trên bài
    Um Mani Padme Hum...!!

  7. #7
    Ngày gia nhập
    11 2011
    Bài viết
    0

    theo góp ý của bạn mình đã sửa lại hàm Push và Pop lại,thực ra là gộp inserthead thành Push và removehead thành Pop nhưng tình hình là chạy vẫn không như mong muốn

    C++ Code:
    1. void Stack::Push(int x)
    2. {
    3.     node*new_node= createnode(x);
    4.     if (new_node==NULL)
    5.         return ;
    6.     if(phead==NULL)
    7.     {
    8.         phead=new_node;
    9.         ptail=phead;
    10.     }
    11.     else
    12.     {
    13.         new_node->pnext=phead;
    14.         phead=new_node;
    15.     }
    16. }
    17.  
    18. int Stack::Pop()
    19. {
    20.     int x=NULL;
    21.     if(isEmpty()==1)
    22.         return NULL;
    23.     else
    24.     {
    25.         node* p;
    26.         if(phead!=NULL)
    27.         {
    28.             p=phead;
    29.             x=p->data;
    30.             phead=phead->pnext;
    31.             delete p;
    32.             if(phead==NULL)
    33.             ptail=NULL;
    34.         }
    35.     }
    36.     return x;
    37. }
    Attached Thumbnails Attached Thumbnails screenshot.jpg  
    Đã được chỉnh sửa lần cuối bởi nntrungduy : 15-03-2012 lúc 01:11 AM.

  8. #8
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Tôi đã bảo cậu rồi
    if (new_node=NULL) <--- Cái gì thế này ?
    if(phead=NULL) <--- Cái gì nữa thế này ?

    Vấn đề cơ bản dẫn đến lỗi vẫn không chịu sửa(đã nói rồi chứ phải không đâu)

    Bó phép! Tự xoay sở lấy về sau, tôi chịu rồi
    Đã được chỉnh sửa lần cuối bởi clchicken : 15-03-2012 lúc 11:46 AM. Lý do: Chỉ nhầm người
    Um Mani Padme Hum...!!

  9. #9
    Ngày gia nhập
    11 2011
    Bài viết
    0

    chỉ là lỗi cú pháp thôi mà,quan trọng là mình mới học đang cố gắng tiếp thu,bạn chỉ giúp mình mấy cái nguyên nhân nó sai,chứ quan tâm đến cú pháp nhiều làm gì.với lại viết cách hay hay dở là do người ta học rồi rút kinh nghiệm.mình chỉ đọc sách nên chỉ biết lấy ví dụ từ sách mà thôi,chứ không thể hay theo ý bạn được

  10. #10
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Cú pháp sai thì chương trình nó ko chạy được nữa chứ nói gì đến hay hay dở
    Đã chỉ cho hơn 1 lần rồi
    Um Mani Padme Hum...!!

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

  1. Bài tập C++ copy noi dung tu stack S sang stack D
    Gửi bởi thaodn_chuprong trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 12
    Bài viết cuối: 18-10-2012, 11:45 PM
  2. Cấu trúc dữ liệu Chuyển các phần tử từ stack này sang stack kia như thế nào?
    Gửi bởi rukawa1184 trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 9
    Bài viết cuối: 06-12-2011, 06:52 PM
  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. Stack trên C | Lỗi khó hiểu trong Stack
    Gửi bởi tom3cang trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 22-05-2009, 11:09 PM
  5. Code về stack | Chuyển hệ số 10 sang 2 dùng stack
    Gửi bởi ahappyboy89 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 17-04-2009, 09:48 AM

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