데이터 구조: 스 택 (링크 로 구현)
/*
* this file is an implementation of stack with linked list
* file name: stack.c
* author: John Woods
* date: 2015/5/9
* statement: anyone can use this file for any purpose
*/
#include <stdio.h>
#include <stdlib.h>
#define BOOL int
#define TRUE 1
#define FALSE 0
typedef struct SNode {
int value;
struct SNode * next;
}* SNode;
typedef struct Stack {
int depth;
SNode top;
}* Stack;
/* operation declaration */
void stackInit(Stack * p_myStack);
void pop(Stack myStack);
void push(Stack myStack);
void stackClear(Stack myStack);
void stackDestroy(Stack * p_myStack);
BOOL isExist(Stack myStack);
/* menu */
void menu();
/* entrance: main function */
int main(void) {
Stack myStack = NULL;
int choice;
char c;
while(TRUE) {
menu();
while(!scanf("%d", &choice)) while('
' != (c=getchar()) && EOF != c);
switch(choice) {
case 1:
stackInit(&myStack);
break;
case 2:
stackClear(myStack);
break;
case 3:
push(myStack);
break;
case 4:
pop(myStack);
break;
case 5:
stackDestroy(&myStack);
break;
default:
exit(EXIT_SUCCESS);
break;
}
}
return 0;
}
/* menu implementation */
void menu() {
printf("
\t****************MENU****************
");
printf("\t* 1.initial stack 2.clear stack *
");
printf("\t* 3.push element 4.pop element *
");
printf("\t* 5.destroy stack 6.exit *
");
printf("\t****************MENU****************
");
printf("Your choice:");
}
/* operation implementation */
void stackInit(Stack * p_myStack) {
if(isExist(*p_myStack)) {
printf("This stack is already exist, cannot initial it!
");
return;
}
if(NULL == (*p_myStack = (Stack)malloc(sizeof(struct Stack)))) {
printf("Out of memory!
");
return;
}
(*p_myStack)->top = NULL;
(*p_myStack)->depth = 0;
printf("Initial successfully!
");
}
void pop(Stack myStack) {
SNode pNode = NULL;
int out;
char c;
if(!isExist(myStack)) {
printf("This stack is not exist! Please initial it first!
");
return;
}
if(0 == myStack->depth) {
printf("This stack is empty! Cannot pop the top value!
");
return;
}
while(TRUE) {
out = myStack->top->value;
pNode = myStack->top;
myStack->top = myStack->top->next;
myStack->depth--;
free(pNode);
pNode = NULL;
printf("The value has been popped is %d
", out);
if(0 == myStack->depth) {
printf("This stack is empty now, cannot continue popping!
");
break;
}
while('
' != (c=getchar()) && EOF != c);
printf("Go on?(y/n):");
if('y' != (c=getchar()) && 'Y' != c) break;
}
}
void push(Stack myStack) {
SNode pNode = NULL;
int value;
char c;
if(!isExist(myStack)) {
printf("This stack is not exist! Please initial it first!
");
return;
}
while(TRUE) {
if(!(pNode = (SNode)malloc(sizeof(struct SNode)))) {
printf("Out of memory!
");
return;
}
printf("Please input the value:");
while(!scanf("%d", &value)) while('
' != (c=getchar()) && EOF != c);
pNode->value = value;
pNode->next = myStack->top;
myStack->top = pNode;
myStack->depth++;
pNode = NULL;
printf("Push successfully!
");
while('
' != (c=getchar()) && EOF != c);
printf("Go on?(y/n):");
if('y' != (c=getchar()) && 'Y' != c) break;
}
}
void stackClear(Stack myStack) {
if(!isExist(myStack)) {
printf("This stack is not exist! Please initial it first!
");
return;
}
SNode pNode = NULL;
while(myStack->top) {
pNode = myStack->top;
myStack->top = myStack->top->next;
free(pNode);
}
myStack->top = NULL;
myStack->depth = 0;
printf("Clear successfully!
");
}
void stackDestroy(Stack * p_myStack) {
if(!isExist(*p_myStack)) {
printf("This stack is not exist! Please initial it first!
");
return;
}
stackClear(*p_myStack);
free(*p_myStack);
*p_myStack = NULL;
printf("Destroy successfully!
");
}
BOOL isExist(Stack myStack) {
if(NULL == myStack) return FALSE;
else return TRUE;
}
여기 서 말 하고 싶 은 것 은 type: def 입 니 다. type: def 는 새로운 데이터 형식 을 '패키지' 합 니 다. \ # define 과 많이 다 릅 니 다.
/* typedef */
typedef struct SName{
int data;
} * SName;
/* */
SName temp = (SName)malloc(sizeof(struct SName));
/* temp , , , stack.c stackInit() stackDestroy() */
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.