接続リストスタックの使用
2463 ワード
#include <stdio.h>
#include <stdlib.h> //malloc, free
typedef struct stack { //연결리스트 노드 구조체 정의
char data; //문자를 저장할 변수
struct stack* link; //다음 노드의 주소값을 저장할 포인터 변수
} stack;
stack* top; //스택의 맨 위의 노드 주소를 저장할 포인터 변수 (기본값은 NULL)
int isEmpty();
void push(char data);
char pop();
char peek();
void printStack();
int isEmpty() //스택이 공백 상태인지 검사하는 함수
{
if (top == NULL) { //top이 아무것도 가리키지 않는 경우
puts("에러: 스택이 비어있습니다.\n");
return 1; //true
}
return 0; //false
}
void push(char data)
{
stack* newnode = (stack *)malloc(sizeof(stack)); //새로운 노드 newnode 동적할당
newnode->data = data; //newnode의 data에 값 저장
newnode->link = top; //newnode의 link에 맨 위의 노드 주소 저장 (top이 맨 위 노드 주소를 가지고 있음)
top = newnode; //이제 newnode가 맨 위의 노드가 되었으므로 top에 newnode 주소 저장
}
char pop() //스택에 노드를 제거하는 함수. 반환형은 char이지만 해당 stack 자료형에 맞게 수정해서 사용해도 됨
{
if (!isEmpty()) { //배열이 비어있지 않은 경우
stack* temp = top; //temp 포인터 변수를 선언해 맨 위 노드의 주소값을 저장
char data = temp->data; //data 변수를 새로 선언하여 맨 위 노드의 데이터 저장
top = temp->link; //top 포인터에 2번째 노드(맨 위 다음 노드)의 주소값 저장
free(temp); //맨 위 노드 제거
return data; //데이터 리턴
}
else
return 0;
}
char peek() //스택의 맨 위 원소를 반환하는 함수
{
if (!isEmpty()) //스택이 비어있지 않은 경우
return top->data; //맨 위 노드의 데이터 반환
else
return 0;
}
void printStack() //스택을 출력할 함수
{
if (!isEmpty()) { //스택이 비어있지 않은 경우
stack* temp = top; //각 노드들을 접근하기 위한 temp 변수 선언
while (temp) { //현재 노드가 NULL이 아닐 경우 반복함
printf("%c ", temp->data); //현재 가리키는 노드의 data를 출력
temp = temp->link; //temp가 다음 노드를 가리키도록 함
}
puts("");
}
}
int main()
{
printStack();
push('A');
push('C');
printStack();
pop();
push('E');
push('G');
printStack();
pop();
pop();
printStack();
return 0;
}
Reference
この問題について(接続リストスタックの使用), 我々は、より多くの情報をここで見つけました https://velog.io/@doheeklm/연결리스트를-이용한-stackテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol