1. 연결된 스택(Linked Stack)
스택은 First In First Out (FIFO) 형태의 자료구조이다.
연결된 스택은 스택을 배열이 아닌 연결리스트로 구현한 것이다.
겉으로 보기에는 배열로 구현한 것과 별 차이가 없지만
연결리스트로 구현할 경우 동적 메모리 할당을 하기 때문에 메모리 크기에 제한받지 않는다.
다만 구현이 조금 까다롭다(라고 보통 말하던데 까다로운가..? 잘 모르겠다..)
2. 삽입 연산(push)
삽입을 할 경우 새로 만든 노드의 링크는 현재 스택의 top이 가리키는 링크가 되게 하고
그리고 새로 만든 노드가 top이 되게 하면
새로 만든 노드가 가장 위에 있는 스택 구조가 된다.
void push(LinkedStackType *s){
int data;
StackNode* new_node;
printf("push data : ");
scanf("%d", &data);
//새로운 노드 만들기
new_node = (StackNode*)malloc(sizeof(StackNode));
new_node->data = data;
//새로운 노드 연결하기
new_node->link = s->top; //새로운 노드의 link가 현재 top이 가리키는 노드를 연결한다.
s->top = new_node; //새로운 노드가 top이 된다.
}
3. 삭제 연산(pop)
삭제 연산의 경우 top이 가리키는 노드의 다음 링크가 top이 되게 구현하면 된다.
//공백 상태인지 확인하는 함수
int is_empty(LinkedStackType *s){
return s->top == NULL; //top이 NULL인지 확인
}
//삭제하는 함수
void pop(LinkedStackType *s){
StackNode *temp = s->top;
if(!is_empty(s)){
printf("pop data : %d\n", temp->data);
s->top = s->top->link;
free(temp);
}else{
printf("no data\n");
}
}
(1. 내가 만든 코드는 현재 top이 가리키는 노드의 데이터를 peek하고 delete하는 형태로 만들었다.)
2. 스택을 연결리스트로 구현했으니 메모리의 제한을 받지 않으므로
배열로 구현했을 때처럼 is_full과 같은 함수가 없는데 반면
삭제 연산은 현재 top이 NULL인지를 확인하는 is_empty 함수를 같이 구현했다.)
<<전체 코드>>
더보기
//이중 연결 리스트
#include <stdio.h>
#include <stdlib.h>
//스택 노드 타입 선언
typedef struct stackNode{
int data;
struct stackNode* link;
}StackNode;
typedef struct{
StackNode *top;
}LinkedStackType;
//공백 상태 확인 함수
int is_empty(LinkedStackType *s){
return s->top == NULL;
}
//스택 삽입
void push(LinkedStackType *s){
int data;
StackNode* new_node;
printf("push data : ");
scanf("%d", &data);
new_node = (StackNode*)malloc(sizeof(StackNode));
new_node->data = data;
new_node->link = s->top;
s->top = new_node;
}
//스택 삭제
void pop(LinkedStackType *s){
StackNode *temp = s->top;
if(!is_empty(s)){
printf("pop data : %d\n", temp->data);
s->top = s->top->link;
free(temp);
}else{
printf("no data\n");
}
}
//스택 출력
void print_stack(LinkedStackType *s){
StackNode *temp;
for(temp=s->top; temp != NULL; temp=temp->link){
printf("%d ", temp->data);
}
printf("\n");
}
int main(int argc, const char * argv[]) {
int menu;
LinkedStackType s;
s.top = NULL;
do{
printf("========================\n");
printf("1.push 2.pop 3.print 4.end\n");
printf("========================\n");
printf("menu : ");
scanf("%d", &menu);
if(menu == 1){
push(&s);
}else if(menu == 2){
pop(&s);
}else if(menu == 3){
print_stack(&s);
}
}while(menu != 4);
}
'CS > 자료구조' 카테고리의 다른 글
[자료구조] 연결리스트로 구현한 큐(queue) (0) | 2022.06.13 |
---|---|
[자료구조] 배열로 구현한 스택(stack) (0) | 2022.06.13 |
[자료구조] 원형 연결리스트(Circular LinkedList) (0) | 2022.06.09 |
[자료구조] 연결리스트(Linked List) (0) | 2022.06.09 |
[자료구조] 시간복잡도, 빅오표기법 (0) | 2022.04.26 |