DATA 전문가로 가는 길

[Perl] 자료구조 스택과 큐 (LIFO, FIFO) 본문

Programming/Perl

[Perl] 자료구조 스택과 큐 (LIFO, FIFO)

EstenPark 2009. 4. 13. 23:40
1. 스택
  • 리스트의 한쪽 끝에서 수행 되는 선형 리스트 한가지 형태로서 스택의 작업에는 삽입(push), 삭제(pop)
  • LIFO(Last In Frist Out) 스택에 마지막으로 입력된 자료가 제일 먼저 삭제 하는 방식

 

 
#!/usr/bin/perl

use strict;
use warnings;

my @stack;
my @data = ('one','two','three','four','five');

foreach my $str ( @data ) {
	print "Initial Stack     : $str \n";
	push (@stack, $str);
	print "Add item to Queue : @stack \n";
}
print "---------------------------------------\n";
print "Stack : @stack \n";
print "---------------------------------------\n";
my $count = @stack;

foreach ( 1..$count ) {
	my $pop_stack = pop @stack;
	print "Popping    to stack  : $pop_stack \n";
	print "Remove item to Stack : @stack \n";
}
print "---------------------------------------\n";
print "Stack : @stack \n";
print "---------------------------------------\n";
결과 : 
---------------------------------------
Initial Stack     : one 
Add item to Queue : one 
Initial Stack     : two 
Add item to Queue : one two 
Initial Stack     : three 
Add item to Queue : one two three 
Initial Stack     : four 
Add item to Queue : one two three four 
Initial Stack     : five 
Add item to Queue : one two three four five 
---------------------------------------
Stack : one two three four five 
---------------------------------------
Popping    to stack  : five 
Remove item to Stack : one two three four 
Popping    to stack  : four 
Remove item to Stack : one two three 
Popping    to stack  : three 
Remove item to Stack : one two 
Popping    to stack  : two 
Remove item to Stack : one 
Popping    to stack  : one 
Remove item to Stack :  
---------------------------------------
Stack :  
---------------------------------------
보시면 알겠지만 스택의 의미는 배열에 차례대로 입력 하게 됩니다. 즉 마지막 원소의 값에 push 하는 방식이라고 생각 하시면 됩니다.
  • push (@stack, $str);
    밀어 넣다. 말그대로 입니다. 배열에 있는 원소에 그냥 밀어 넣는 거죠. 그렇게 되면 배열에는 차례대로 값이 입력 되게 됩니다. 1,2,3,4,5 와 같이 말입니다.
  • my $pop_stack = pop @stack;
    popping 제가 한때 아주 좋아하던 춤..이였던.. pop은 빠져나오는 값을 의미 하기도 합니다. 배열에 있는 값을 하나하나 빼기 위해서 사용 하는 함수 입니다. 방법은 LIFO와 같이 마지막에 입력된 값이 먼저 빠지게 됩니다.
2. 큐
  • 큐는 여려개의 데이터 항목을 일정한 순서대로 나열 하는 형태로 push(입력), pop(삭제) 작동
  • FIFO(Frist In Frist OUT)   선입선출 방법으로 가장 먼저 데이터에 대해서 삭제 하는 방법

 
#!/usr/bin/perl

use strict;
use warnings;

my @queue;
my @data = ('one','two','three','four','five');

foreach my $str ( @data ) {

	print " Initial Stack    : $str \n";
	unshift (@queue, $str);
	print "Add item to Queue : @queue \n";
}

print "---------------------------------------\n";
print "Queue : @queue \n";
print "---------------------------------------\n";
my $count = @queue;

foreach (1..$count) {

	my $pop_queue = pop @queue;
	print "Popping to queue     : $pop_queue \n";	
	print "Remove item to Queue : @queue \n";
}

print "---------------------------------------\n";
print "Queue : @queue \n";
print "---------------------------------------\n";
결과 :
---------------------------------------
Initial Stack    : one 
Add item to Queue : one 
 Initial Stack    : two 
Add item to Queue : two one 
 Initial Stack    : three 
Add item to Queue : three two one 
 Initial Stack    : four 
Add item to Queue : four three two one 
 Initial Stack    : five 
Add item to Queue : five four three two one 
---------------------------------------
Queue : five four three two one 
---------------------------------------
Popping to queue     : one 
Remove item to Queue : five four three two 
Popping to queue     : two 
Remove item to Queue : five four three 
Popping to queue     : three 
Remove item to Queue : five four 
Popping to queue     : four 
Remove item to Queue : five 
Popping to queue     : five 
Remove item to Queue :  
---------------------------------------
Queue :  
---------------------------------------
스택과 다른 동작을 하는 부분을 찾으셨는지 모르겠습니다.
바로 이부분 인데요. Queue : five four three two one  최종적으로 배열에 쌓인 원소를 보면 5,4,3,2,1 형태로 들어간 것을 확인 할 수 있습니다. 바로 이부분이 큐의 정의라고 볼 수 있습니다.

  • unshift (@queue, $str);
    unshift함수를 이용하여 배열의 첫번째 요소에 삽입하는 방식입니다. 위에 결과를 보시면 값이 추가적으로 뒤로 밀리는 현상을 보실수 있습니다.
  • my $pop_queue = pop @queue;
    이부분은 스택과 같은 동작을 합니다. 하지만 데이터 들은 다소 다른데요. 그이유는 앞서 말씀 드린것 처럼 배열에 들어있는 원소들의 위치가 스택과는 차이점을 가지고 있습니다.


오늘 카페에 어떤분이 파스칼 문법을 가지고 perl로 구성하는 방식을 물어 보셨고 작성자인 나도 굉장히 궁금해서 컴퓨터 포멧과 동시에 문서를 작성했습니다.
C언어로 했을때와 좀 다른건 어떤 방식을 부여하는 Stack, Queue가 아닌 perl은 배열을 가지고 논?다는 생각이 들었습니다.

그외 shift() 함수도 있는데요.

 
#!/usr/bin/perl

use strict;
use warnings;


print "SUM : ". sub_num( 12345 ) ." \n";

sub sub_num {
    my $sum;
    map {$sum += $_} split //, shift  ;
    return $sum;
}
결과 :
SUM : 15
1~5까지 원소를 받아서 더한 값을 보내주시는 아주 착한 shift입니다.


perldoc -f shift
perldoc -f unshif
perldoc -f pop
perldoc -f push



http://docstore.mik.ua/orelly/perl/advprog/index.htm 
와 정말 좋은 내용 많은.. ㅎㄷㄷ

================================================================================
http://docstore.mik.ua/orelly/perl/advprog/index.htm                   (APPerl)
http://doc.perl.kr/twiki/bin/view/Wiki/HowToStartPerl                  (펄덕펄덕)
http://cafe.naver.com/perlstudy.cafe                                 (대한민국Perl커뮤니티)
================================================================================

 

'Programming > Perl' 카테고리의 다른 글

[Perl] Net::FTP를 활용한 시스템 체크  (0) 2009.05.14
[Perl] 정규표현식  (0) 2009.04.24
[Perl] 특정 문자를 찾아서 라인 출력  (0) 2009.04.11
[Perl] Perl Command-Line Options  (2) 2009.04.09
[Perl] 서브루틴  (0) 2009.04.07
Comments