8. 순차리스트를 통해 스택 구현하기
스택을 구현해주세요.
1. 순차자료형으로 구현을 해주세요.
스택에 원소를 삽입하는 push 함수를 구현 해주시구요.
스택에 원소를 제거하는 pop 함수를 구현해주세요.
top에 있는 원소의 값을 반환하거나
스택의 값을 모두 출력해주세요.
순차자료형의 크기는 100으로 해주세요.
문제풀이
스택이란?
통안에 자료를 넣는 것이라 생각하면된다.
자료를 차곡차곡 쌓아가는 과정이다.
그래서 자료를 쌓는 과정을 push라고 하고,
자료를 삭제하는 과정을 pop 이라고 합니다.
맨 위의 자료는 보이기 때문에 조회를 할 수 있습니다.
(제일 처음에 넣었던 자료를 확인하고 싶다면 pop을 통해 모두 빼내어야합니다.)
순차자료형으로 구현한다면 정말 쉽다.
결국 배열 문제이기 때문
구현을 하던 중 들었던 생각이다.
스텍이라는 친구는 push() 함수를 불러올때
매개변수를 입력하는가?
우선 자료구조의 활용을 먼저 살펴보기로했다.
[C++][STL] Stack 기본 사용법 및 예제 (tistory.com)
해당 블로그를 보자.
stack<int> stack을 선언하고
stack.push(넣을값)
stack.pop()
으로 구현된 것을 볼 수 있었다.
그렇다면
stack은 전역변수로 선언이 되거나
포인터형으로 선언이 되어있어야한다.
(그러나 포인터로 할 경우 주소값을 함수에 넘겨주어야 한다.)
그러니 전역변수로 구현을 하는 것이 맞다고 생각한다.
#include<iostream>
using namespace std;
#define STACK_SIZE 100
int start_stack();
string stack[STACK_SIZE];
int top = start_stack();
//스택을 공백상태로 만들어준다.
int start_stack() {
return 0;
}
// 스택이 공백상태인지 판단
bool empty_stack() {
if (top > 0)
return true;
else
return false;
}
// 스택이 가득차있는가?
bool full_stack() {
if (top == 99)
return false;
else
return true;
}
// 순차리스트로 push를 구현한다
void push(string str) {
if(full_stack() == true)
stack[top++] = str;
else {
cout << "스텍이 꽉찼습니다.";
}
}
// 순차리스트로 pop을 구현한다.
string pop() {
string str;
if (empty_stack() == true)
return stack[(top--)-1];
else {
cout << "주의 : 빈 스텍입니다 " << endl;
return "\0";
}
}
// top 값을 출력해주세요.
string peek() {
if (empty_stack() == false)
cout << "주의 : 빈 스텍입니다 " << endl;
return stack[top-1];
}
// 스텍의 모든 요소들을 출력해주세요.
void print_stack_value() {
cout << "STACK [";
for (int i = 0; i < top; i++)
cout << stack[i] << ",";
cout << "] \n";
}
// 메인문
int main() {
string insert_str;
cout << "stack 입니다~" << endl;
while (true) {
print_stack_value();
cout << "작업을 선택해주세요. >> 1. push 2.pop 3.peek 조회 4. 종료";
int sel;
cin >> sel;
switch (sel) {
case 1:
cout << "push >> ";
cin >> insert_str;
push(insert_str);
break;
case 2:
cout << "pop >> " << pop() << endl;
break;
case 3:
cout << "peak = " << peek() << endl;
break;
case 4:
cout << "종료합니다.";
return 0;
break;
}
}
}
그리고 갑자기 든 생각.
스텍을 그러면 클래스로 구현해볼까?
그러면 변수도 템플릿으로 선언해서 다양한 상황에 대응시키자.
#include<iostream>
using namespace std;
#define STACK_SIZE 100
template <class T>
class stack {
T stack_value[STACK_SIZE];
int top;
public:
stack() {
top = 0;
}
bool empty_stack() {
if (top > 0)
return true;
else
return false;
}
bool full_stack() {
if (top == 99)
return false;
else
return true;
}
void push(T str) {
if (full_stack() == true)
stack_value[top++] = str;
else {
cout << "스텍이 꽉찼습니다.";
}
}
T pop() {
T str;
if (empty_stack() == true)
return stack_value[(top--) - 1];
else {
cout << "주의 : 빈 스텍입니다 " << endl;
return 0;
}
}
T peek() {
if (empty_stack() == false)
cout << "주의 : 빈 스텍입니다 " << endl;
return stack_value[top - 1];
}
void print_stack_value() {
cout << "STACK [";
for (int i = 0; i < top; i++)
cout << stack_value[i] << ",";
cout << "] \n";
}
};
int main() {
stack<int> sta;
int insert_str;
cout << "stack 입니다~" << endl;
while (true) {
sta.print_stack_value();
cout << "작업을 선택해주세요. >> 1. push 2.pop 3.peek 조회 4. 종료";
int sel;
cin >> sel;
switch (sel) {
case 1:
cout << "push >> ";
cin >> insert_str;
sta.push(insert_str);
break;
case 2:
cout << "pop >> " << sta.pop() << endl;
break;
case 3:
cout << "peak = " << sta.peek() << endl;
break;
case 4:
cout << "종료합니다.";
return 0;
break;
}
}
}
실제로 stack을 사용하는 것처럼 사용할 수 있다.
재밌군.