자료구조(2)

Hi Beck·2023년 8월 2일

자료구조

목록 보기
2/4

스택의 함수들

B.is_full
is_full 함수는 매개변수를 스택으로 받으며, 스택이 가득차있는지 확인하는 함수이다.

#include<stdio.h>
#include<stdlib.h>


typedef struct stacktype {				//stacktype이라는 구조체를 정의 
	int arr[100];						//stacktype 구조체 내에서 크기 100의 정수 배열 arr을 선언. 이 배열은 스택의 요소를 저장하는 데 사용한다.
	int top;                            //stacktype 구조체 내에서 정수 변수 top을 선언. top은 배열의 스택에 푸시된 마지막 요소의 인덱스를 추적한다.

}


void init(stacktype* s)                  //스택을 초기화하는 데 사용되는 init 함수 정의문.stacktype 구조체에 대한 포인터를 인수로 사용함
                                         //s는 stackType 구조에 대한 포인터를 나타내는 데 사용되는 매개변수 이름
{
	s->top=-1;                          //스택이 가리키는값을 -1로 초기화.배열은 인덱스가 0부터 시작하니깐 -1로 해놓고 인덱스의 합이 0이면 데이터가 하나 있는거고,-1이면 인덱스의 증가가 없는것이니 비어있는것                          
}


int is_full(stacktype *s)               //함수 정의(매개변수는 구조체의 포인터 즉 주소값)
{
	if(s->top==SIZE-1)                  //데이터를 계속 푸시하면 top이 -1에서 배열의 임의의 크기 SIZE에서 -1을 한 것(0을 빼줌)까지 갈 것이고 거길 가리키면 배열이 꽉차있는것을 의미한다.(더넣으면 오버플로우)
    	return 1;                       //꽉 차있으면 1을 반환
    return 0;                           //차지않았으면 0을 반환      
}

int main()
{
	stacktype s;                         //stacktype 유형의 s 변수를 선언하여 스택의 인스턴스를 생성
	init(&s);

	is_full(s);

	printf("%d", is_full(s));            //1과0을 실시간에 따라 반환

	return 0;
}

C.push 함수
push함수는 스택의 상단에 데이터를 삽입(push)해주는 함수다.

#include<stdio.h>
#include<stdlib.h>


typedef struct stacktype {				//stacktype이라는 구조체를 정의 
	int arr[100];						//stacktype 구조체 내에서 크기 100의 정수 배열 arr을 선언. 이 배열은 스택의 요소를 저장하는 데 사용한다.
	int top;                            //stacktype 구조체 내에서 정수 변수 top을 선언. top은 배열의 스택에 푸시된 마지막 요소의 인덱스를 추적한다.

}


void init(stacktype* s)                  //스택을 초기화하는 데 사용되는 init 함수 정의문.stacktype 구조체에 대한 포인터를 인수로 사용함
                                         //s는 stackType 구조에 대한 포인터를 나타내는 데 사용되는 매개변수 이름
{
	s->top=-1;                          //스택이 가리키는값을 -1로 초기화.배열은 인덱스가 0부터 시작하니깐 -1로 해놓고 인덱스의 합이 0이면 데이터가 하나 있는거고,-1이면 인덱스의 증가가 없는것이니 비어있는것                          
}


void push(stacktype *s, int value)      //push함수는 매개변수로 구조체에 대한 포인터와 넣을 데이터를 받는다.
{
	if(is_full(s))                     //데이터를 넣기전에 스택이 차있는 상태로 푸시를 하면 스택오버플로우가 나기때문에 full 유무를 확인해야된다.이때 참이면 찼다는 문구를 출력하고 종료한다.
    {
    	printf("stack is full");
        exit(1);
    }
    
    printf("pushed:%d", value);       //넣은 값을 출력
    s->arr[++(s->top)]=value;         //꽉 찬 경우가 아닐시 먼저 s가 주소값을 넘겨준 배열 즉 스택의 맨 위에 메모리 공간을 하나 더 만들어주고, 그 곳을 top이 가리키게해서 거기에 value를 대입해주기. ex)top이 -1인 상태에서 데이터를 넣어주면 인덱스0번째의 메모리공간이 먼저 생기고,거기에 해당 value가 들어간다.

}

int main()
{
	stacktype s;                         //stacktype 유형의 s 변수를 선언하여 스택의 인스턴스를 생성
	init(&s);

	push(&s, 4);

	return 0;
}

D.pop
pop함수는 스택에서 데이터를 뺄 때 쓰는 함수이다.(매개변수 스텍)
push와 다르게 데이터를 제거하고 메모리를 제거하는 배열 안에 들어있는 값을 반환하는 코드가 존재해서 삭제되는 값을 출력할 수 있다.

#include<stdio.h>
#include<stdlib.h>


typedef struct stacktype {				//stacktype이라는 구조체를 정의 
	int arr[100];						//stacktype 구조체 내에서 크기 100의 정수 배열 arr을 선언. 이 배열은 스택의 요소를 저장하는 데 사용한다.
	int top;                            //stacktype 구조체 내에서 정수 변수 top을 선언. top은 배열의 스택에 푸시된 마지막 요소의 인덱스를 추적한다.

}


void init(stacktype* s)                  //스택을 초기화하는 데 사용되는 init 함수 정의문.stacktype 구조체에 대한 포인터를 인수로 사용함
                                         //s는 stackType 구조에 대한 포인터를 나타내는 데 사용되는 매개변수 이름
{
	s->top=-1;                          //스택이 가리키는값을 -1로 초기화.배열은 인덱스가 0부터 시작하니깐 -1로 해놓고 인덱스의 합이 0이면 데이터가 하나 있는거고,-1이면 인덱스의 증가가 없는것이니 비어있는것                          
}


int pop(stacktype *s)                 //매개변수에 별도의 데이터가 필요없다.그냥 스택 자체를 제거함
{
	if(is_empty(s))                   //스택이 비어있으면 오류나서 엠티유무를 확인해야된다.
    {
    	printf("stack is empty");     
        exit(1);
	}
    return s->arr[(s->top)--];        //비어있지않으면 리턴을 하는데 스택 변수 s가 arr 배열의 값을 가리키고,이때 top의 데이터를 리턴시켜준다.그리고 메모리 하나를 감소시킨다.(크기가 하나 감소)
}

int main()
{
	stacktype s;                         //stacktype 유형의 s 변수를 선언하여 스택의 인스턴스를 생성
	init(&s);

	push(&s, 3);                        //푸시했다고 가정(정의문생략)
    
    printf("\n pop:%d \n", pop(&s));    //pop한 데이터 출력 및 크기 감소

	return 0;
}
  • 증감 연산자가 앞에 있으면 먼저 실행되고,뒤에 있으면 그 후에 실행된다.

E.peek
peek함수는 스택 상단에 있는 데이터를 단지 무엇인지만 알 수 있게해주는 반환만 해주는 함수다.pop과 구조가 유사하다.

#include<stdio.h>
#include<stdlib.h>


typedef struct stacktype {				//stacktype이라는 구조체를 정의 
	int arr[100];						//stacktype 구조체 내에서 크기 100의 정수 배열 arr을 선언. 이 배열은 스택의 요소를 저장하는 데 사용한다.
	int top;                            //stacktype 구조체 내에서 정수 변수 top을 선언. top은 배열의 스택에 푸시된 마지막 요소의 인덱스를 추적한다.

}


void init(stacktype* s)                  //스택을 초기화하는 데 사용되는 init 함수 정의문.stacktype 구조체에 대한 포인터를 인수로 사용함
                                         //s는 stackType 구조에 대한 포인터를 나타내는 데 사용되는 매개변수 이름
{
	s->top=-1;                          //스택이 가리키는값을 -1로 초기화.배열은 인덱스가 0부터 시작하니깐 -1로 해놓고 인덱스의 합이 0이면 데이터가 하나 있는거고,-1이면 인덱스의 증가가 없는것이니 비어있는것                          
}


int peek(stacktype* s)
{
    if(is_empty(s))                     //스택이 비어있는지 확인
    {
    	printf("stack is empty");     
        exit(1);
	}
	return s -> arr[(s->top)];         //구조체가 가리키는 배열의 top을 추적해 안에 있는 데이터를 반환한다.
}


int main()
{
	stacktype s;                         //stacktype 유형의 s 변수를 선언하여 스택의 인스턴스를 생성
	init(&s);

	push(&s, 3);                        //푸시했다고 가정(정의문생략)
    
    printf("\n peek:%d \n", peek(&s)); 
    
    printf("\n pop:%d \n", pop(&s));    //pop한 데이터 출력했다고 가정(정의문생략)
    
    

	return 0;
}

F.함수들 출력해보기

#include<stdio.h>
#include<stdlib.h>

typedef struct stacktype {
	int arr[100];
	int top;

}

stacktype;

void init(stacktype* s)
{

	s->top = -1;

}

int is_empty(stacktype* s)
{
	if (s->top == -1)

		return 1;

	return 0;
}

int is_full(stacktype* s)
{
	if (s->top == 100 - 1)
		return 1;
	return 0;
}


void push(stacktype* s, int value)
{
	if (is_full(s))
	{
		printf("stack is full");
		exit(1);
	}

	printf("pushed:%d", value);
	s->arr[++(s->top)] = value;
}

int pop(stacktype* s)
{
	if (is_empty(s))
	{
		printf("stack is empty");
		exit(1);
	}
	return s->arr[(s->top)--];

}

int peek(stacktype* s)
{
	if (is_empty(s))
	{
		printf("stack is empty");
		exit(1);
	}
	return s->arr[(s->top)];
}



int main()
{
	stacktype s;
	init(&s);

	push(&s, 3);
	push(&s, 2);
	push(&s, 1);

	printf("\npeek:%d\n", peek(&s));

	printf("\n pop:%d \n", pop(&s));
	printf("\n pop:%d \n", pop(&s));
	printf("\n pop:%d \n", pop(&s));

	return 0;
}

실행 결과
pushed:3
pushed:2
pushed:1
peek:1
pop:1
pop:2
pop:3

profile
Emotional realizer

0개의 댓글