Lỗi xuất các giá trị trong class Stack

chào mn !
mình đang xây dựng lớp Stack thì gặp vấn đề là sau đi xuất các phần tử ra lần thì bình thường,nhưng nếu xuất lần 2 thì không còn phần tử nào cả

void MyStack::xuat()
{
	if (isEmpty() == true)
		cout << "Stack dang rong !!!";
	while(!isEmpty())
	{
		cout << " " << peek();
		pop();
	}
}

Lý do là vì khi mình tạo một đối tượng giá trị rồi mình gọi đến hàm xuất thì trong hàm xuất nó thực hiện thao tác xuất phần từ trong ngăn xếp bằng cách: xuất ra các phần tử ở đỉnh ngăn xếp(peek()), rồi xóa phần tử đầu ngăn xếp đi (pop()) cho đến khi stack rỗng thì dừng.Khi mình gọi đến lần 2 thì nó đã pop() hết các phần tử trong ngăn xếp ra rồi.Tùy mình biết nhưng chả thể nào fix được
Con lớp Stack dựng sẵn thì k bị lỗi này !
Mình post lên đây mong mọi người giúp đỡ mình với ạ
Cảm ơn mọi người

Đã pop() cho đến empty() thì làm gì còn nữa.
Lớp dựng sẵn nào mà pop() mà vẫn còn thế?

3 Likes

Mình biết lỗi rồi ạ
cảm ơn bạn

1 Like

Bạn ơi mình mình hàm swap này sao vẫn ra kết quả mà cô vấn nói sai vậy ạ

class MyStack
{
private:
	int TOP = -1;//top
	int *S;//array
	int capacity;//size

void MyStack::swapStack(MyStack &s1, MyStack &s2)
{
	int top;
	int capa;
	int *s;
	s = new int[100];
	top = s1.TOP;
	s = s1.S;
	capa= s1.capacity;
	
	s1.capacity = s2.capacity;
	s1.TOP = s2.TOP;
	s1.S = s2.S;
	
	s2.capacity = capa;
	s2.TOP = top;
	s2.S = s;
}

Mình nhận ra rồi.
Bạn đang thực hiện phương thức trên chính đối tượng lớp Stack của bạn tạo (this).
Thế nên, phương thức chỉ cần 1 tham số là Stack khác và chuyển (swap) với Stack hiện tại (this).

3 Likes

Còn về vấn đề vùng nhớ cơ
Khi gán mang kiểu thế thì có ổn không ?
Có xảy ra trường hợp ngoại lệ gì đó khi dùng phép gán như này ?
Cô mình nói gì về vùng nhớ đó,mà mình k hiểu cho lắm
Bạn có thể giúp minh được không ạ

void MyStack::swapStack(MyStack &s1)
{
	int top;
	int capa;
	int *s;
	s = new int[100];

	top = this.TOP;
	s = this.S;
	capa= this.capacity;
	
	this.capacity = s1.capacity;
	this.TOP = s1.TOP;
	this.S = s1.S;
	
	s2.capacity = capa;
	s2.TOP = top;
	s2.S = s;
}

ý bạn là như này à
2 cách trên vẫn ra kết quả đúng
nhưng mình muốn hỏi là mảng gán như thế có xảy ra ngoại lệ k y?

Đúng như vậy! Dùng this.

Theo mình thì chẳng có gì sai. Cả 3 dữ liệu của Stack đã được đảo với nhau thống nhất rồi.
À, bỏ dòng s = new int[100]; đi. Dòng này chẳng có tác dụng gì hết.

3 Likes

Do chương trình k lỗi nên mình k biết lý do là gì
sao mà cô bảo là có thể sai,Không chỉ trường hợp cụ thể
nói chung mình cũng quên lời cô nói rồi
ok cảm ơn b nhiều
nói cái mình cũng yên tâm :smiley:
mà b có biết cái emplace trong Stack k ạ ?
mình muốn xây dựng nó, mà đọc tài liệu trên kia chả hiểu gì ?
nếu bạn biết thì có thể giúp,không thì thôi vậy

Do lớp MyStack của bạn không dùng template (chỉ int) nên emplace() chẳng khác gì push().

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?