배열로 Stack 만들기 (C)
// 배열로 Stack 만들기
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct stack {
int top;
int capacity;
int* array;
} Stack;
Stack* createStack(int capacity) {
Stack* stack = (Stack*)malloc(sizeof(Stack));
memset(stack, 0, sizeof(Stack));
stack->capacity = capacity;
stack->top = -1;
stack->array = (int *)malloc(stack->capacity*sizeof(int));
memset(stack->array, 0, stack->capacity*sizeof(int));
return stack;
}
int isFull(Stack* stack) {
return stack->top == stack->capacity-1;
}
int isEmpty(Stack* stack) {
return stack->top == -1;
}
void push(Stack* stack, int item) {
if(isFull(stack)) {
printf("stack이 꽉찼습니다.\\n");
return;
}
stack->array[++stack->top] = item;
printf("%d pushed to stack\\n", item);
}
int pop(Stack* stack) {
if(isEmpty(stack)) {
return -9999;
}
return stack->array[stack->top--];
}
// array에서 top이 가리키는 data를 단순히 반환하는 함수
int peek(Stack* stack) {
if(isEmpty(stack)) {
return -9999;
}
return stack->array[stack->top];
}
int main() {
Stack* stack = createStack(100);
push(stack, 10);
push(stack, 20);
push(stack, 30);
push(stack, 40);
printf("%d pop from stack\\n", pop(stack));
printf("%d pop from stack\\n", pop(stack));
push(stack, 50);
printf("%d peeked from stack\\n", peek(stack));
printf("%d pop from stack\\n", pop(stack));
printf("%d pop from stack\\n", pop(stack));
printf("%d pop from stack\\n", pop(stack));
// 메모리 해제
free(stack);
return 0;
}
연결리스트로 Stack 만들기 (C)
// 연결리스트로 Stack 만들기
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct stackNode {
int data;
struct stackNode* next;
} StackNode;
StackNode* createStackNode(int data) {
StackNode* node = (StackNode*)malloc(sizeof(StackNode));
memset(node, 0, sizeof(StackNode));
node->data = data;
node->next = NULL;
return node;
}
int isEmpty(StackNode* root) {
return !root;
}
void push(StackNode** root, int data) {
if(*root == NULL) {
*root = createStackNode(data);
printf("%d pushed to stack\\n", data);
} else {
StackNode* node = (StackNode*)malloc(sizeof(StackNode));
memset(node, 0, sizeof(StackNode));
node->data = data;
node->next = *root;
*root = node;
printf("%d pushed to stack\\n", data);
}
}
int pop(StackNode** root) {
// stack이 비었을 때
if (isEmpty(*root))
return -9999;
int popped;
popped = (*root)->data;
*root = (*root)->next;
return popped;
}
int peek(StackNode** root) {
if (isEmpty(*root))
return -9999;
return (*root)->data;
}
int main() {
StackNode* root = NULL;
push(&root, 10);
push(&root, 20);
push(&root, 30);
push(&root, 40);
printf("%d pop from stack\\n", pop(&root));
printf("%d pop from stack\\n", pop(&root));
push(&root, 50);
printf("%d peeked from stack\\n", peek(&root));
printf("%d pop from stack\\n", pop(&root));
printf("%d pop from stack\\n", pop(&root));
printf("%d pop from stack\\n", pop(&root));
return 0;
}