/**
* 栈(链栈):
* 本程序中栈的存储方式:栈顶->节点->节点->...->栈底。即:栈顶是第一个元素*/#include
//栈中存储的数据的类型
typedef intElemType;//栈中的节点的数据结构体
typedef structStackNode {
ElemType value;//栈节点中存储的数据的值
struct StackNode* nextNode; //下一个节点
} StackNode;//栈的数据结构体
typedef structStack {
StackNode* data; //栈中存储的所有节点
int length; //栈的长度
StackNode* topNode; //栈顶元素节点
} Stack;//初始化一个空栈
Status initStack(Stack*S) {
S->data = (StackNode*)malloc(sizeof(StackNode));if(S->data ==NULL) {
printf("初始化栈失败!");returnFAILURE;
}
S->length = 0;
S->topNode =NULL;returnSUCCESS;
}//销毁栈
Status destroyStack(Stack*S) {
StackNode*tmpNode;if(S->data ==NULL) {
printf("栈不存在,销毁失败!");returnFAILURE;
}while(S->topNode != NULL && S->topNode != S->data) {
tmpNode= S->topNode;
S->topNode = S->topNode->nextNode;free(tmpNode);
}
S->data =NULL;
S->length = 0;
S->topNode =NULL;returnSUCCESS;
}//清空栈
Status clearStack(Stack*S) {
StackNode*tmpNode;if(S->data ==NULL) {
printf("栈不存在,清空失败!");returnFAILURE;
}if(S->topNode ==NULL) {returnSUCCESS;
}while(S->topNode != S->data) {
tmpNode= S->topNode;
S->topNode = S->topNode->nextNode;free(tmpNode);
}
S->topNode =NULL;
S->length = 0;returnSUCCESS;
}//判断栈是否为空
Status isStackEmpty(Stack*S) {if(S->data ==NULL) {
printf("栈不存在!");
exit(1);
}if(S->length == 0) {returnTRUE;
}returnFALSE;
}//获取栈中元素的长度
int getStackLength(Stack*S) {if(S->data ==NULL) {
printf("栈不存在!");
exit(1);
}return S->length;
}//查看栈顶元素的值
ElemType getTopElem(Stack*S) {if(S->data ==NULL) {
printf("栈不存在,获取元素失败!");
exit(1);
}if(S->topNode ==NULL) {
printf("栈是空栈,获取元素失败!");
exit(1);
}return S->topNode->value;
}//元素入栈
Status push(Stack*S, ElemType e) {
StackNode*tmpNode;if(S->data ==NULL) {
printf("栈不存在,元素入栈失败!");returnFAILURE;
}
tmpNode= (StackNode*)malloc(sizeof(StackNode));if(tmpNode ==NULL) {
printf("元素入栈失败!");returnFAILURE;
}
tmpNode->value =e;
S->length++;if(S->topNode ==NULL) {
S->topNode =tmpNode;
S->topNode->nextNode = S->data;returnSUCCESS;
}
tmpNode->nextNode = S->topNode;
S->topNode =tmpNode;returnSUCCESS;
}//元素出栈
StackNode* pop(Stack*S) {
StackNode*tmpNode;if(S->data ==NULL) {
printf("栈不存在,元素出栈失败!");
exit(1);
}if(S->topNode ==NULL) {
printf("栈是空栈,元素出栈失败!");returnNULL;
}
tmpNode= S->topNode;
S->topNode = S->topNode->nextNode;if(S->topNode == S->data) {
S->topNode =NULL;
}
tmpNode->nextNode =NULL;
S->length--;returntmpNode;
}//遍历栈中的元素
void traverseStack(Stack*S) {
StackNode*tmpNode;if(S->data ==NULL) {
printf("栈不存在,遍历失败!");
exit(1);
}if(S->topNode ==NULL) {
printf("栈是空栈,遍历失败!");
exit(1);
}
printf("遍历栈:");
tmpNode= S->topNode;while(tmpNode != S->data) {
printf("%-4d", tmpNode->value);
tmpNode= tmpNode->nextNode;
}
printf("");
}//栈的测试函数
inttestStack() {//数据声明
Stack stack;
StackNode*node;inti;//初始化栈
if(initStack(&stack) ==SUCCESS) {
printf("初始化栈成功!");
}//判断栈是否是空栈
printf("栈是否为空栈?%s", isStackEmpty(&stack) == TRUE ? "是" : "否");//元素入栈
for(i = 1; i <= 5; i++) {if(push(&stack, i) ==SUCCESS) {
printf("元素%d入栈成功!", i);
}
}//遍历栈中的元素
traverseStack(&stack);//元素出栈
node = pop(&stack);if(node !=NULL) {
printf("元素%d成功出栈!", node->value);
}//遍历栈中的元素
traverseStack(&stack);//查看栈顶元素的值
printf("栈顶元素的值是:%d", getTopElem(&stack));//获取栈的长度
printf("栈的当前长度:%d", getStackLength(&stack));//清空栈
if(clearStack(&stack) ==SUCCESS) {
printf("清空栈成功!");
}//销毁栈
if(destroyStack(&stack) ==SUCCESS) {
printf("销毁栈成功!");
}return 0;
}