Lỗi truy xuất stack trả về rỗng

Nó ra toàn stack is empty ạ.

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<conio.h>

using namespace std;

int current_size = -1;

const int max_size = 100;

int stack[max_size];

bool isEmpty()
{
	return (current_size = -1);
}

bool isFull()
{
	return(current_size==max_size);
}

void push(int data)
{
	if(!isFull())
	{
		current_size++;
		stack[current_size]=data;
	}
	else
	{
		cout<<"Stack full";
	}
}

int top()
{
	if(!isEmpty)
	{
		int data = stack[current_size];
		//current_size--;
		return data;
	}
	else
	{
		cout<<"Stack is empty ! "<<"\n";
	}
}

int pop()
{
	if(!isEmpty)
	{
		int data = stack[current_size];
		current_size--;
		return data;
	}
	else
	{
		cout<<"Stack is empty ! "<<"\n";
	}
}


int main()
{
	
	push(100);
	push(-255);
	push(-25);
	cout<<"top : "<<top()<<"\n";
	pop();
	cout<<"top : "<<top()<<"\n";
	while (!isEmpty())
	{
		int data = pop();
		cout<<data<<" <-- ";
	}
	
	cout<<"\n";
	system("pause");
	return 0;
}

Xem kĩ lại phép so sánh đúng chưa.

4 Likes

so sánh thế nào mới được ạ

Trong MISRA có 1 rule thế này:

  • Nếu dùng phép so sánh thì đặt hằng số ở trước, biến ở sau. Ví dụ: if (-1 == size) để tránh cái bug nho nhỏ mà khó nhìn ra như trên. :sweat_smile:
4 Likes

Hmmm… Phép so sánh trong C/C++ ??? Kiến thức cơ bản mà?

1 Like

chỗ bạn nói là chỗ nào ạ

Chỗ mà ai cũng biết là chỗ nào đó :joy: (trừ bạn)

5 Likes

Chỗ này chứ chỗ nào :thinking:? Cái này sai ở một điểm rất cơ bản: Phép so sánh xem hai giá trị có bằng nhau không thì dùng == chứ không phải là =, = là dùng cho phép gán. Ngoài ra, giá trị trả về của phép so sánh sẽ thuộc kiểu bool với một trong hai giá trị true (đúng) và false (sai).

4 Likes

sửa xong thì nó bị lặp vô tận ạ

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<conio.h>

using namespace std;

int current_size = -1;

const int max_size = 100;

int stack[max_size];

bool isEmpty()
{
	return (current_size == -1);
}

bool isFull()
{
	return(current_size==max_size);
}

void push(int data)
{
	if(!isFull())
	{
		current_size++;
		stack[current_size]=data;
	}
	else
	{
		cout<<"Stack full";
	}
}

int top()
{
	if(!isEmpty)
	{
		int data = stack[current_size];
		//current_size--;
		return data;
	}
	else
	{
		cout<<"Stack is empty ! "<<"\n";
	}
}

int pop()
{
	if(!isEmpty)
	{
		int data = stack[current_size];
		current_size--;
		return data;
	}
	else
	{
		cout<<"Stack is empty ! "<<"\n";
	}
}


int main()
{
	
	push(100);
	push(-255);
	push(-25);
	cout<<"top : "<<top()<<"\n";
	pop();
	cout<<"top : "<<top()<<"\n";
	while (!isEmpty())
	{
		int data = pop();
		cout<<data<<" <-- ";
	}
	
	cout<<"\n";
	system("pause");
	return 0;
}

Gọi hàm sai cách, coi lại những chỗ bạn gọi isEmpty nha. :kissing:

3 Likes

Bạn vui lòng đọc kĩ đoạn code trên giúp mình, à có một gợi ý nho nhỏ ở đây:

Có một điểm khá kì lạ trong một số ngôn ngữ lập trình như C, C++, C#, Python, Javascript,…là một hàm không có () thì tương đương với địa chỉ của hàm hoặc cái gì đó => trong phép so sánh, nó tương đương với true, và vì không có () nên hàm đó không được gọi ? :thinking:. Ví dụ:

int foo(){
  cout << "A useless message..." << "\n";
};
cout << foo << "\n";
2 Likes

[ Có một điểm khá kì lạ trong một số ngôn ngữ lập trình như C, C++, C#, Python, Javascript,…là một hàm không có () thì tương đương với 1 hoặc cái gì đó]
Ở trong C/C++(ngôn ngữ biên dịch) thì “Cái gì đó”, ở đây chính là “ĐỊA CHỈ CỦA HÀM” trong memory.
“Địa chỉ” xác định thì luôn !=0.
func() : Gọi hàm func
→ a = func(); → Gọi hàm func, kết quả return gán lại cho a.
func : Lấy địa chỉ hàm func.
→ a = func; → Lấy địa chỉ của func gán vào cho a.
→ if( func ) → Luôn true.

Còn Python, Javascript thì nó là cái gì thì hông biết.

4 Likes

@VannyTraanf Hmmm… Tại sao mình test trên C/C++ thì nó in ra 1 nhỉ :thinking:? Trong Python thì nó in ra địa chỉ đúng như bạn nói, còn trong Javascript thì một hàm có thể được coi là một biến (một điểm khá kì lạ trong Javascript so với các ngôn ngữ khác)

2 Likes

1 câu hỏi rất hay.

Trả lời,
Trong C++ (không bao gồm C), cout<< func ra 1 là do toán tử “<<” dc tải bội, kết hợp với chuẩn bool convert của C++ nên đã tự cast toán hạng bên phải thành bool.
Chứ ko phải bản thân “func” là bool mang giá trị 1.
■Link tham khảo:

5 Likes

ở đây có giải thích chi tiết hơn nè. Do thứ tự overload resolution gì đó (dài quá ko đọc nổi) :V :V mà int* thì in ra như const void*, còn function pointer thì đi cast thành bool O_O

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