Stack (C 언어)
2021. 1. 30. 10:04ㆍ알고리즘
C++ stack container 함수 정리 및
C stack 구현 예시
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAX_STACK_SIZE 1000
#define MAX_INPUT_SIZE 100
//stack에 들어갈 data 구조체
typedef struct {
int xPos;
int yPos;
} stackMemNode;
//stack 구조체
typedef struct {
stackMemNode memory[MAX_STACK_SIZE]; //data가 저장될 배열
int Top; //stack의 top 위치를 가리키는 변수
} stack;
bool empty(stack *);
void pop(stack *);
void push(stack *, stackMemNode *);
size_t size(stack *);
stackMemNode *top(stack *);
void printStack(stack *);
int main(void)
{
//stack 선언
stack *st = (stack *)malloc(sizeof(stack));
//stack의 memory 초기화
for (int i = 0; i < MAX_STACK_SIZE; i++) {
st->memory[i].xPos = -1;
st->memory[i].yPos = -1;
}
st->Top = -1;
//입력받은 명령어를 저장할 문자열
char inputString[MAX_INPUT_SIZE];
//push할 data는 여기에 저장해서 인자로 넘겨줌.
stackMemNode *nodeData;
//push 하기 위해 입력받은 data 임시 저장함.
int temp;
nodeData = (stackMemNode *)malloc(sizeof(stackMemNode));
while (1) {
printf("1.'empty'\n2.'pop'\n3.'push'\n4.'size'\n5.'top'\n6.'print'\n7.'exit'\n");
printf("input order: ");
scanf("%s", inputString);
nodeData->xPos = -1;
nodeData->yPos = -1;
//empty 명령이 들어올 때
if (!strcmp(inputString, "empty")) {
if (empty(st)) {
printf("true\n");
}
else {
printf("false\n");
}
}
//pop 명령이 들어올 때
else if (!strcmp(inputString, "pop")) {
pop(st);
}
//push 명령이 들어올 때
else if (!strcmp(inputString, "push")) {
//stack에 들어갈 data 입력 받기
printf("xPos: ");
scanf("%d", &temp);
nodeData->xPos = temp;
printf("yPos: ");
scanf("%d", &temp);
nodeData->yPos = temp;
push(st, nodeData);
}
//size 명령이 들어올 때
else if (!strcmp(inputString, "size")) {
printf("%zu\n", size(st));
}
//top 명령이 들어올 때
else if (!strcmp(inputString, "top")) {
nodeData = top(st);
printf("xPos: %d, yPos: %d\n", nodeData->xPos, nodeData->yPos);
}
//print 명령이 들어올 때
else if (!strcmp(inputString, "print")) {
printStack(st);
}
else if (!strcmp(inputString, "exit")) {
break;
}
//그 이외의 명령이 들어올 때
else {
printf("undefined order\n");
}
printf("\n");
}
free(nodeData);
return 0;
}
bool empty(stack *st)
{
if (st->Top == -1) //stack이 비어있을 때
return true;
else
return false;
}
void pop(stack *st)
{
if (st->Top == -1) //stack이 비어있어서 pop할 data가 없을 때
return;
st->memory[st->Top].xPos = -1; //data를 -1로 초기화
st->memory[st->Top].yPos = -1;
st->Top--; //data 개수가 하나 줄었으므로 top 1 감소
return;
}
void push(stack *st, stackMemNode *node)
{
st->Top++; //data 개수가 하나 증가했으므로 top 1 증가
st->memory[st->Top].xPos = node->xPos; //data를 대입
st->memory[st->Top].yPos = node->yPos;
return;
}
size_t size(stack *st)
{
return (size_t)(st->Top + 1); //data가 배열에 저장되어 있어서 Top이 0부터 시작하므로 개수는 +1 해준다.
}
stackMemNode *top(stack *st)
{
stackMemNode *pNode = malloc(sizeof(stackMemNode)); //구조체를 반환하기 위해서는 동적할당이 필요
//stack이 비어있을 때
if (st->Top == -1) {
pNode->xPos = -1;
pNode->yPos = -1;
return pNode;
}
//top 위치의 값을 대입해서 반환
pNode->xPos = st->memory[st->Top].xPos;
pNode->yPos = st->memory[st->Top].yPos;
return pNode;
}
void printStack(stack *st) //stack 모든 data 출력
{
for (int i = 0; i <= st->Top; i++) {
printf("xPos: %d\tyPos: %d\n", st->memory[i].xPos, st->memory[i].yPos);
}
printf("\n");
return;
}
'알고리즘' 카테고리의 다른 글
Priority Queue (최대 힙) (C 언어) (0) | 2021.02.21 |
---|---|
Queue (C 언어) (0) | 2021.02.04 |