스택 응용 3. 진법 변환
2022. 4. 23. 00:34ㆍC++/자료구조
10진수 26을 2 진수로 변환한다고 해보자.
먼저, 26을 2로 나누었을때, 나머지인 0을 push 한다.
그 몫인 13을 다시 2로 나누고, 나머지인 1을 push한다.
다시 그 몫인 6을 2로 나누고 나머지인 0을 push한다.
다시 그 몫인 3을 2로 나누고 나머지인 1을 push한다.
그 후 더이산 나눠지지 않는 몫인 1을 push한다.
2022.04.22 - [C++/자료구조] - 연결 리스트를 이용한 스택 구현
#include <iostream>
using namespace std;
typedef int element; //int형 자료형에 element라 별칭 붙임.
typedef struct Node //노드는 구조체 타입
{
element Data; //스택 데이터를 정수 타입으로 가정
Node *Next; //다음 노드를 가리키는 포인터 변수
}node;
class LinkedStack
{
public:
LinkedStack(); //생성자 함수
LinkedStack(const LinkedStack & S); //복사 생성자 함수
~LinkedStack(); //소멸자 함수
void Push(element item); //item값을 스택에 삽입
int Pop(); //스택 탑의 데이터 값을 리턴함
bool IsEmpty(); //비어 있는지 확인
bool IsFull(); //꽉차 있는지 확인
private:
node* Top; //첫 노드를 가르키는 포인터
};
int main(void)
{
int num = 26;
int init = num;
LinkedStack nc;
while(num/2 != 1)
{
nc.Push(num%2);
num = num/2;
}
nc.Push(num%2);
nc.Push(num/2);
cout<<init<<"(10): ";
while(!nc.IsEmpty())
cout<<nc.Pop();
cout<<"(2)"<<endl;
}
LinkedStack::LinkedStack()
{
Top = nullptr; //탑 포인터 값을 널로 세팅
}
LinkedStack::~LinkedStack() //소멸자 함수
{
int Temp;
while(!IsEmpty()) //스택이 완전히 빌 때 까지
Temp = Pop(); //계속해서 팝
}
bool LinkedStack::IsEmpty() //스택이 비어있는지 확인하는 함수
{
return bool(Top == nullptr); //Top이 Null 이면 True
}
bool LinkedStack::IsFull() //꽉차 있는지 확인
{
return !IsEmpty(); //isEmpty 함수가 True면 False
}
void LinkedStack::Push(element item) //스택의 삽입 함수
{
node *NewTop = new node; // 새로운 노드 공간 할당
NewTop->Data = item; // 넘어온 데이터 복사
NewTop->Next = Top; // 새 노드가 현재 상태의 첫 노드를 가리킨다.
Top = NewTop; // 탑이 새로운 노드를 가리킨다.
}
element LinkedStack::Pop()
{
if(IsEmpty())
cout<<"스택이 비어있습니다."<<endl;
else
{
node* Temp = Top; //탑 포인터 백업
element Item = Temp->Data; //탑 노드의 데이터 백업
Top = Top->Next; //탑이 다음 노드를 기리키게 한다.
delete Temp; // 이전 탑 공간 반납
return Item; // 이전 탑 데이터 리턴
}
}
'C++ > 자료구조' 카테고리의 다른 글
스택 응용 5. 괄호 매칭 (0) | 2022.04.23 |
---|---|
스택 응용 4. 문자열 뒤집기 (0) | 2022.04.23 |
스택 응용 2. 후위 표현의 연산 (0) | 2022.04.23 |
스택 응용 1. 백 스페이스 키 (0) | 2022.04.22 |
배열을 이용한 스택 구현 (0) | 2022.04.22 |