본문 바로가기
알고리즘창고

[C] 배열 기반 스택 (array stack)

by 야호호코코 2018. 7. 10.
반응형

 배열로 만든 스택은 연결리스트에 비해 매우 간단해서 좋다. 그래서 빠르게 코딩을 해야할 때 자주 사용한다. 하지만 C++에는 stack 헤더가 있다.


 배열로 구현할 때의 장점은 연결리스트에 비해 메모리를 아낄 수 있다는 점, 그리고 구조가 간단하다..! 제한을 걸어놓은 과제나 문제를 풀 때 용이하다. 단점크기가 제한되어 있다는 것. 하지만 realloc이 있다면?



 연결리스트로 구현했던 코드와 다른 점은 실행하고 명령어 입력 전에 스택의 크기를 먼저 입력한다.


 명령어


 push N -> 정수 N을 push한다

 pop -> 스택을 pop하고 그 값을 출력한다. 스택이 비어있으면 Stack Empty 출력

 size -> 스택의 크기를 출력한다.

 top -> top에 위치한 값을 출력한다. 스택이 비어있으면 Stack Empty 출력

 print -> 스택 내 모든 값들을 출력한다. 스택이 비어있으면 Stack Empty 출력

 exit -> 프로그램 종료



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

int N;		// MAX_SIZE
int top = 0;

void push(int *, int);
int pop(int *);
void printAll(int *);
int getSize(int *);
int isEmpty(int *);
int getTop(int *);

int main(){

	int *s;

	int n;

	int i;
	char order[10];

	printf("MAX STACK SIZE : "); scanf("%d", &N);

	s = (int *)malloc(sizeof(int) * N);

	while (1) {

		scanf("%s", order);

		if (strcmp(order, "push") == 0) {
			scanf("%d", &n);
			getchar();
			push(s, n);
		}
		else if (strcmp(order, "pop") == 0) {
			if (isEmpty(s)) {
				printf("Stack Empty\n");
			}
			else {
				printf("pop : %d\n", pop(s));
			}
		}
		else if (strcmp(order, "size") == 0) {
			printf("size : %d\n", getSize(s));
		}
		else if (strcmp(order, "top") == 0) {
			if (isEmpty(s)) {
				printf("Stack Empty\n");
			}
			else {
				printf("top : %d\n", getTop(s));
			}
		}
		else if (strcmp(order, "print") == 0) {
			printAll(s);
		}
		else if (strcmp(order, "exit") == 0) {
			break;
		}

	}

	return 0;

}

void push(int *s, int n) {

	if (N <= top) {
		printf("Stack FULL\n");
		return;
	}
	
	s[top++] = n;

}

int pop(int *s) {

	top--;

	return s[top];

}

void printAll(int *s) {

	int i;

	if (isEmpty(s)) {
		printf("Stack Empty\n");
		return;
	}

	for (i = 0; i < top; i++) {
		printf("%d\n", s[i]);
	}

}

int getSize(int *s) {
	return top;
}

int isEmpty(int *s) {
	return top == 0;
}

int getTop(int *s) {
	return s[top - 1];
}


반응형