소프트웨어학과 원성현 교수 1
자료구조 강의노트
교재 : C로 배우는 쉬운 자료구조(개정판) 출판사 : 한빛미디어(2011년 3월 발행) 저자 : 이지영
소프트웨어학과 원성현 교수 64
6장 스택
소프트웨어학과 원성현 교수 65
1. 스택
• 스택(stack)이란? • 사전적 의미는 ‘쌓아올린 더미’ • 데이터가 입력된 순서와 반대로 출력되는 데이터 구조 • 후입 선출, 즉 LIFO(Last In First Out) 리스트라고 함
• 스택의 실생활 예 • 부페식당에 쌓여있는 접시
• 스택의 컴퓨터 시스템 예 • 순차적으로 오픈한 윈도우
스택 정의
A
B
C 입력순서 : A – B - C
출력순서 : C – B - A
가장 오래된 자료 →
가장 최신 자료 →
소프트웨어학과 원성현 교수 66
2. 추상 자료형 스택
• 상단(top) : 스택에서 제일 나중에 입력된 데이터의 위치 • 하단(bottom) : 스택에서 제일 먼저 입력된 데이터의 위치 • 요소(element) : 스택에 저장되는 데이터 그 자체 • 공 스택(empty stack) : 아무런 데이터도 갖고 있지 않은 스택
스택의 구성
createStack(S) : 스택 생성 isEmpty(S) : 스택 S가 비어있는지 검사 isFull(S) : 스택 S가 꽉 차있는지 검사 push(S,item) : 스택의 S의 top에 item을 추가 pop(S) 또는 delete(S) : 스택 S의 top에 있는 요소 삭제 peek(S) : 스택 S의 top에 있는 요소를 삭제하지 않고 반환
push(S,x) top=top+1; if(top>stack_SIZE) then overflow; else S(top)=x; end push()
pop(S) if(top=0) then underflow; else { return S(top); top=top-1; } end pop()
←스택에 데이터 삽입
스택에서 데이터 삭제→
첨자 1부터를 가정
소프트웨어학과 원성현 교수 67
3. 스택의 구현
순차 자료구조를 이용한 스택의 구현(삽입과 삭제)
#include <stdio.h> #include <stdlib.h> #define STACK_SIZE 100 typedef int element; element stack[STACK_SIZE]; int top=-1; void push(element item) { if (top>=STACK_SIZE-1) { printf(“\n\n Stack is FULL!\n”); return; } else stack[++top]=item; }
element pop() { if (top==-1) { printf(“\n\n Stack is EMPTY!\n”); return 0; } else return stack[top--]; }
• 순차 자료구조를 이용한 스택의 구현 방법 • 일정한 크기의 1차원 배열을 정의 • top이라는 변수를 정의하고 -1로 초기화(첨자 0부터를 가정) • 데이터가 삽입될 때는 top을 1 증가, 삭제될 때는 top을 1 감소
소프트웨어학과 원성현 교수 68
• 순차 자료구조를 이용한 스택 구현의 문제점 • 배열로 구현하기 때문에 구현하기는 쉽지만, 물리적으로 크기가 고정된 배열을 쓰기 때문에 크기 변경이 어렵고 기억 공간의 낭비 발생
• 연결 자료구조를 이용한 스택 구현 • 스택에 삽입할 데이터가 발생할 때 연결 리스트의 노드를 생성하고 데이터를 저장한 후 링크 생성 • top의 링크 변경
연결 자료구조를 이용한 스택의 구현
top data link
n번째 원소
첫번째 원소
두번째 원소
…
n번째 원소
두번째 원소
첫번째 원소 null
…
소프트웨어학과 원성현 교수 69
top null
① 빈 스택 생성 ② 원소 A 삽입 : push(S,A)
top data link
A null 100
100
③ 원소 B 삽입 : push(S,B)
top data link
B 200
200
A null
100
100
④ 원소 C 삽입 : push(S,C)
top data link
C 300
300
A null
100
200
B
200 100
⑤ 원소 삭제 : pop(S)
top data link
200
A null
100
B
200 100
소프트웨어학과 원성현 교수 70
4. 스택의 응용
역순 문자열 만들기
A
B
C
D
A
B
C
A
B
A
A
B
C
D
A
B
C
A
B
A
D C B A
A B C D
소프트웨어학과 원성현 교수 71
• 프로그램 간의 호출과 복귀 • 가장 나중에 호출된 함수가 가장 먼저 실행을 완료하고 복귀 • 호출은 스택에 데이터 삽입, 복귀는 스택에서 데이터 삭제를 의미 • 함수를 호출하면 호출된 함수로 컨트롤이 옮겨가야 하기 때문에 현재 작업 중인 지역변수, 매개변수 및 수행이 종료된 후 복귀할 주소 등의 정보를 스택 프레임에 저장하여 스택에 삽입 • 함수의 실행이 끝나면 시스템 스택의 top에 있는 원소를 삭제하고 프레임에 저장되어 있던 주로를 확인하고 복귀
시스템 스택
main F_1() F_2()
F_1()
a:
end main()
F_2()
b:
end F_1() end F_1()
소프트웨어학과 원성현 교수 72
수식의 괄호 검사
{ A [ ( i + 1 ) ] = 0; }
{ {
[
{
[
(
{ {
[
{ [ ( 성공
• 여는 괄호가 나올 때마다 스택에 삽입하고, 닫는 괄호가 나올 때는 여는 괄호를 스택에서 삭제
• 수식의 마지막 괄호까지 처리했을 때 스택이 비어 있으면 성공
소프트웨어학과 원성현 교수 73
if ( ( i == 0 ) && ( j == 0 )
( (
(
(
(
( (
(
( 오류
(
• 여는 괄호가 나올 때마다 스택에 삽입하고, 닫는 괄호가 나올 때는 여는 괄호를 스택에서 삭제
• 수식의 마지막 괄호까지 처리했을 때 스택이 비어 있지 않으면 실패
소프트웨어학과 원성현 교수 74
수식의 후위 표기법 변환
• 수식의 표현법 • 전위 표기법(prefix)
• 연산자가 피연산자 앞에 오는 표기법 • 중위 표기법(infix)
• 연산자가 피연산자 사이에 오는 표기법 • 후위 표기법(postfix)
• 연산자가 피연산자 뒤에 오는 표기법 • 컴퓨터시스템에서의 표기법
• 후위 표기법 • 연산의 우선순위를 나타내기 위해 괄호를 사용하지 않아도 되기 때문
전위 표기법 : - + a * b c ÷ d e 중위 표기법 : a + b * c – d ÷ e 후위 표기법 : a b c * + d e ÷ -
소프트웨어학과 원성현 교수 75
a + b * c – d ÷ e
+
연산자
스택
+
*
- -
÷
-
• 중위표기법 산술식의 후위표기법 변환
a ab abc
+
-
*
+
-
abc* abc*+ abc*+d abc*+de abc*+de ÷ abc*+de ÷
소프트웨어학과 원성현 교수 76
3 + 5 * 2 – 7 ÷ 2
3
+
피연산자 스택
연산자 스택
3
5
+
*
3
5
+
2
-
3
10
*
+
-
13
-
13
7
-
÷
13
7
2
-
13
3.5
9.5
• 산술식의 연산