자료구조

[자료구조] chap4. 스택

rngPwns 2024. 10. 16. 19:14

4.1 스택이란? 

-스택: 뭔가를 쌓아놓은 더미, 후입선출

입출력은 맨 위에서만 일어나고 스택의 중간에서는 데이터를 삭제할 수 없다.

 

  • 스택 상단 : 입출력이 이루어지는 부분
  • 스택 하단: 반대쪽 바닥부분
  • 요소: 스택에 저장되는 것
  • 공백 스택: 스택에 요소가 하나도 없을 때

*자료 출력순서가 입력순서 역순으로 이루어져야 할 경우 유용

*함수호출 이후 자신을 호출한 함수로 되돌아갈 때 호출된 역순으로 되돌아가야 하므로 스택 사용(복귀할 주소 기억에 사용)

 

-시스템 스택에는 함수가 호출될때마다 활성레코드가 만들어지며 여기에 복귀주소가 저장된다. (활성레코드에는 프로그램 카운터, 함수호출시 매개변수, 함수 안에서 선언된 지역 변수 같이 생성)

 

 

-함수호출 일어나면 항상 시스템 스택에 동일한 방법으로 저장 > 함수가 자기 자신 호출해도 동일한 방법으로 활성 레코드가 만들어졌다가 없어진다.

 

 

 

 

 

 

[추상 자료형 스택]

 

스택을 추상 자료형으로 정의 : 0개 이상의 요소를 가지는 선형리스트의 일종, 스택에 요소를 추가하거나 삭제하는 연산과 함께 현재 스택상태를 검사하는 연산들로 구성

-두가지 기본연산 : 1. 삽입(push) 2. 삭제(pop) -> push연산 중 스택 가득 차서 입력불가, pop연산중에 스택에 데이터 없어서 출력불가 >> 오류발생!!

 

+ is_empty, is_full 연산: 스택이 공백상태에 있는지, 포화상태에 있는지

+create 연산: 스택생성 

+peek연산: 요소를 스택에서 삭제하지 않고 보기만 함

 

4.2 스택의 구현

1. 1차원배열 :

- int 형의 1차원배열 stack[MAX_STACK_SIZE] 필요. 스택에서 가장 최근에 입력됐던 자료 가리키는 top변수 필요, 가장 먼저 들어온 요소는 stack[0]에, 가장 최근에 들어온 요소는 stack[top]에 저장.

- top변수는 스택 비어있으면 -1의 값 가짐 (top 값이 0이면 배열의 인덱스 0에 데이터 있다는 것 의미)- push()에서 스택에 새로운 요소 삽입하기 전에 스택이 가득 차지 않았나 검사해야 함.(is_full 호출)> 차 있으면 오류메시지+함수반환, 먼저 top값을 증가해야 한다.(top을 증가시키지 않고 삽입하면 마지막 요소 지워짐)-pop(): 스택에서 하나의 요소 제거하는 연산, top이 가리키는 요소를 스택에서 꺼내어 외부로 건네준다. 요소 제거 전 스택 공백여부 확인 위해 is_empty() 호출하여 검사.

 

4.3 동적 배열 스택

-컴파일 시간에 크기 결정되는 1차원 배열> 컴파일 시간에 필요한 스택 크기 알아야 함> 어려움

C언어에서는 malloc() 호출하여 필요할떄마다 메모리 할당> 스택크기 동적으로 늘림

 

4.4 스택의 응용: 괄호 검사문제

조건:

1. 왼쪽 괄호 개수, 오른쪽 괄호 개수가 같아야 함.

2. 같은 종류 괄호에서 왼쪽괄호는 오른쪽 괄호보다 먼저 나와야함

3. 서로 다른 종류의 왼쪽 괄호와 오른쪽 괄호 쌍은 서로를 교차하면 안됨.

 

알고리즘: 왼쪽 괄호 만나면 스택에 삽입, 오른쪽 괄호 만나면 스택에서 맨 위 괄호 꺼내고 오른쪽 괄호와 짝 맞는지 검사.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.5 스택의 응용: 후위 표기 수식의 계산

 

 

 

 

*컴파일러는 주로 후위표기 사용

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-중위표기식-> 후위표기식 과정 : 피연산자는 바로 후위표기수식에 출력, 가장 나중에 스캔된 연산자가 가장 먼저 출력

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

우선순위 높은 연산자들이 있거나 우선순위 같을 때 일단 스택 상단의 요소를 꺼내어 출력해야 함.
왼쪽괄호는 무조건 스택에 삽입, 제일 우선순위 낮은 연산자로 취급, 오른쪽 괄호 만나게 되면 왼쪽괄호 삭제될때까지 왼쪽괄호 위에 쌓여있는 모든 연산자들 출력

 

4.6 스택의 응용: 미로 문제

미로탈출 : 시행착오방법(한 경로 선택해서 시도하고 안되면 다른 경로 시도), 현재의 경로가 안 될 경우 다른 경로들이 어딘가에 저장돼 있어야 함.(현재위치에서 가능한 경로 중 가장 가까운 경로) >> 가장 최근 저장한 경로가 쉽게 추출되는 자료구조 사용해야 함.>> 스택!!