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