스택과 큐
- 배열/리스트 vs 스택/큐
- 공통점: 선형 구조 이다.
- 차이점: 삽입과 삭제의 위치 고정 여부
- 배열/리스트: 임의의 위치에서 삽입/삭제
- 스택: 맨 위(top)
- 큐:
- 삽입: 맨 앞(front)
- 삭제: 맨 뒤(rear)
구조체 포인터(다시 복습 >> 함수 선언할 시에 구조체에 포인터를 사용하기 위해)
포인터가 어떤 변수의 주소를 담아 가리키는 변수이기 때문에 구조체 포인터도 마찬가지로 구조체의 주소를 가리키는 포인터를 구조체 포인터라고 합니다.
구조체 포인터 문법
struct 구조체이름* 구조체포인터이름;// example struct book my_book; struct book* p_my_book; p_my_book = &my_book;
배열의 경우와는 달리 구조체의 이름은 구조체를 가리키는 주소가 아닙니다.
따라서 포인터에 할당할 때는 반드시 주소 연산자(&)를 사용해야 합니다.
구조체 포인터를 이용하여 구조체 멤버에 접근하는 방법은 두 가지가 있습니다.
- 참조 연산자(*)를 이용하는 방법
- 화살표 연산자(->)를 이용하는 방법
구조체 포인터 맴버 접근
1. (*구조체포인터).멤버변수이름
2. 구조체포인터 -> 멤버변수이름// example (*ptr_my_book).author ptr_my_book -> author
(1)번과 같이 허용할 때 주의해야 할 점은 *ptr_my_book.author이 아니라 (*ptr_my_book).author와 같이 괄호를 이용한다는 것입니다. 이 *도 참조 연산자이기 때문에 *ptr_my_book.author같이 이용하면 구조체가 아닌 포인터 변수를 구조체처럼 참조하려고 하기 때문에 오류가 발생합니다.
출처 : https://velog.io/@kio0207/C-Programming-포인터-구조체
1. 구조체로 정의된 배열을 스택 연산으로 구현
#include <stdio.h>
#include <stdlib.h>
#define MAX_STACK_SIZE 100
typedef int element;
typedef struct Stack{
element stack[MAX_STACK_SIZE];
int top;
} Stack;
void init(Stack *s) {
s->top = -1;
}
int is_empty(Stack *s) {
return(s->top == -1);
}
int is_full(Stack *s) {
return(s->top == (MAX_STACK_SIZE-1));
}
void push(Stack *s, element item){
if(is_full(s)) {
fprintf(stderr, "스택포화에러\n");
return;
}
else s->stack[++(s->top)] = item;
}
void pop(Stack *s, element *item) {
if(is_empty(s)) {
fprintf(stderr, "스택공백에러\n");
exit(1);
}
else {
*item = s->stack[(s->top)--];
}
}
element peek(Stack *s){
if(is_empty(s)) {
fprintf(stderr, "스택공백에러\n");
exit(1);
}
else return s->stack[s->top];
}
int main(int argc, const char * argv[]) {
Stack s;
init(&s); // 스택 초기화
// 데이터 푸시
push(&s, 10);
push(&s, 20);
push(&s, 30);
push(&s, 40);
push(&s, 50);
// 스택의 가장 위의 값 확인
printf("Peek: %d\n", peek(&s)); // 50 출력
// 반복문을 이용하여 값 팝
element item;
while (!is_empty(&s)) {
pop(&s, &item);
printf("Pop: %d\n", item);
}
// 이제 스택은 비어있습니다.
if (is_empty(&s)) {
printf("스택이 비었습니다.\n");
}
return 0;
}
2. 연결된 스택 정의
>> 스택노드를 구조체로 정의함, 이 노드는 데이터(element item)와 다음 노드를 가리키는 포인터(struct StackNode *link)로 이루어져있다