식혜드식혜 2024. 4. 15. 15:40

스택

  • 한쪽 끝에서만 데이터를 삽입(Push)하거나 삭제(Pop)할 수 있는 구조
  • 후입 선출(LIFO: Last In First Out) 구조

스택의 구조

 

삽입(push)

Top 포인터

: 가장 나중에 삽입되는 데이터 가리킴( = 삭제할 지점을 가리킴)

- 삽입하고 top 포인터를 1 증가 시켜야 함.

삭제(pop)

Top 포인터

: 가장 나중에 삽입되는 데이터 가리킴 (= 삭제할 지점을 가리킴)

- 삭제하고 top 포인터를 1 감소 시켜야 함.

 

스택에서 발생하는 오류

오버플로(overflow)

언더플로(underflow)

연습문제

<퀴즈>

나의 답변: 1.  X / 삭제는 가장 위의 top에 있는 데이터만 삭제가능하다?

나의답변: 2. O / 스택은 나중에 들어온 값이 먼저 나가게 되는 LIFO 구조이다.

나의답변: 3. O / pop()연산의 시간복잡도와 push()연산의 시간복잡도는 O(1)로 동일하다.

나의답변: 4. O / 가장 위에 있는 원소만 제거가 가능하다.

 

<문제1>

참고글: https://notepad96.tistory.com/25

나의 답변: set result = s.size()를 하면 스택에 담기는 값이 2 아닌가?

result += s.pop()하면 어떻게 되지? 그전에 뺀 값을 다시 더해주는건가...?

그렇게 가정하면 result = 2 + 20+ 15 = 37 , 37*2 = 74?

<문제2>

 

나의 답변:

solution(10)
0~9까지
solution(0) Hello
solution(1) ->(0)호출 Hello
solution(2)-> (0)호출 Hello (1) 호출 -> (0) 호출 Hello 
solution(3)-> (0) 호출 Hello (1) 호출 -> (0) 호출 Hello
 (2) 호출-> (0) 호출 Hello (1) 호출-> (0) 호출 Hello
solution(4)-> (0)호출 Hello
 (1) 호출 -> (0) 호출 Hello
 (2) 호출 -> (0) 호출 Hello (1) 호출 ->(0)호출 Hello
 (3) 호출 -> (0)호출 Hello (1)호출 -> (0)호출 Hello (2)호출 -> (1)호출 ->(0)호출 Hello
Hello: 15개?
'콜' 스택이 뭐지?

<문제3>

나의 코드:


#include<iostream>
using namespace std;

#define SIZE 10
class Stack
{
public:
	void init(char c)
	{
		this->name = c;
		cout << "Constructing stack " << name << endl;
		topIndex = -1; //가리키고 있는 top
	}
	void push(char ch) //삽입
	{
		if (topIndex >= 9) // 가득 차면
		{
			cout << "Stack " << name << " is full" << endl;
		}
		else
		{
			stackArr[++topIndex] = ch; // 전위연산자. 먼저 +=1 하고 대입함
		}
	}
	char pop() // 삭제
	{
		if (topIndex < 0) // 비었으면
		{
			cout << "Stack" << name << "is empty" << endl;
			return NULL; // 반환형이 char이므로
		}
		else
		{
			return stackArr[topIndex--]; //후위연산자. return하고난 뒤 topIndex -= 1;
		}
	}
public:
	int topIndex;
	char name;
	char stackArr[SIZE];
};

int main()
{
	Stack s1, s2;
	int i;
	s1.init('A');
	s2.init('B');

	s1.push('d'); // stackArr[0] = d; 
	s1.push('a'); // stackArr[1] = a;
	s1.push('t'); // stackArr[2] = t;
	s1.push('a'); // stackArr[3] = a; top:3

	s2.push('s'); // [0] = s;
	s2.push('t'); // [1] = t;
	s2.push('a'); // [2] = a;
	s2.push('c'); // [3] = c;
	s2.push('k'); // [4] = k; top:4

	for (i = 0; i < 5; i++) //0~4
		cout << "Pop s1: " << s1.pop() << '\n';
	cout << endl;
	for (i = 0; i < 5; i++) //0~4
		cout << "Pop s2: " << s2.pop() << '\n';
	return 0;

}

<문제4>

<도전 문제 1>

나의 코드:

#include <iostream>
#include <stack>

using namespace std;

void solution(int arr[])
{
	stack<int> s;
	for (int i = 0; i < 6; i++)
	{
		if (s.empty() == true || arr[i] > s.top()) //첫번째 수이거나 마지막 수보다 더 크다면
		{
			s.push(arr[i]);
			cout << arr[i] << " ";
		}

	}
}

int main()
{
	int arr[6] = { 10,30,20,50,60,15 };
	 solution(arr);
}

<도전 문제 2>

나의 코드:

#include <stack>
#include <iostream>
using namespace std;

int main()
{
	int input;
	cout << "10진수 값 입력: ";
	cin >> input;
	stack<int> s;
	while (input != 0)
	{
		s.push(input % 2);
		input /= 2;
	}

	while (!s.empty())
	{
		cout << s.top();
		s.pop();
	}





}

<도전 문제 3>

#include <stack>
#include <iostream>
using namespace std;

	stack<char> s;
void PrintComma(string num)
{
	int cnt = 0;
	for (int i = num.length() - 1; i >= 0; i--)
	{
		s.push(num[i]);
		cnt++;
		if (cnt%3 == 0)
		{
			s.push(',');
		}
	}
}
int main()
{
	string input;
	cin >> input;
	PrintComma(input);
	while (!s.empty())
	{
		cout << s.top();
		s.pop();
	}

}

계획

백준 스택 문제 풀기

  • 다짐일: 4월 15일~
  • 완수일: