컴퓨터 공학 기초/알고리즘 ( algorithm )

Stack 을 이용한 알고리즘

JongSeok_12 2020. 4. 13. 13:20

이번 포스트에서는 스텍 자료구조를 활용하여 문제를 해결한다.

스텍의 특성은 선입후출의 특성을 가지고 있다.

 

문제 1. 스텍 구현

https://www.acmicpc.net/problem/10828

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

www.acmicpc.net

 

해결

// Data_struct_c+.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//

#include <iostream>
#include <istream>
#include <string>
using namespace std;

class STACK{
	
// 스텍 자료구조를 구현할 배열 stack_list 선언 
// 크기 : 10,000 
private:
	int *stack_list;
	int nData = 0;
	int cnt = 0;

// 스텍을 사용하기 위한 인터페이스
// push, pop, size, empty, top 매서드 정의
public:
	STACK(){
		stack_list = new int[10000];
	}
	~STACK(){
		delete[] stack_list;
	}

    // 값 추가
	void push(){
		cin >> stack_list[cnt];
		++cnt;
	}
	
    // 값 꺼내오기
	void pop(){
		if (cnt == 0){
			cout << -1 << endl;
			return;
		}

		else{
			--cnt;
			cout << stack_list[cnt] << endl;
		}
	}

	// 스택 안의 값 갯수 확인
	void size(){
		cout << cnt << endl;
	}

	// 스택이 비엇는지 확인
	void empty(){
		if (cnt == 0){
			cout << 1 << endl;
		}
		else{
			cout << 0 << endl;
		}
	}

	// 스택 가장 위의 값 확인
	void top(){
        if(cnt == 0){
		    cout << -1 << endl;
        }
        else{
            cout << stack_list[cnt-1] << endl;
        }
	}
};


int main()
{
	int n = 0;
	string cmd;
	STACK stack;

	cin >> n;

	for (int i = 0; i < n; ++i){
		cin >> cmd;
		if (cmd == "push"){
			stack.push();
		}
		else if (cmd == "pop"){
			stack.pop();
		}
		else if (cmd == "size"){
			stack.size();
		}
		else if (cmd == "empty"){
			stack.empty();
		}
		else if (cmd == "top"){
			stack.top();
		}
	}
}

 

+ 문자열은 string 컨테이너로 받을 수 있으며 비교할 때 if (cmd == "push") 와 같이 바로 모든 문자열 비교 가능