#define MAX_SIZE 255
#define true 1
#define false 0
typedef struct {
int id;
char * name;
}ElementType;
#include <stdio.h>
#include<stdlib.h>
#include "Element.h"
//链栈的结点
typedef struct StackNode{
ElementType data;//结点中保存的元素
struct StackNode *next;//指向下个结点的指针
}StackNode;
//链栈结构
typedef struct LinkedStack{
StackNode *top;//栈顶指针
int length;//链栈的长度(元素个数)
}LinkedStack;
//链栈的初始化
void InitLinkedStack(LinkedStack *linkedStack);
//链栈的压栈,并返回结果
int PushLinkedStack(LinkedStack * linkedStack,ElementType element);
//链栈的出栈
int PopLinkedStack(LinkedStack * linkedStack,ElementType * element);
//清空栈
void ClearLinkedStack(LinkedStack * linkedStack);
//销毁栈
void DestroyLinkedStack(LinkedStack * linkedStack);
#include "LinkedStack.h"
//链栈的初始化
void InitLinkedStack(LinkedStack *linkedStack){
linkedStack->top=NULL;
linkedStack->length=0;
}
//链栈的压栈,并返回结果
//链栈压栈不存在满栈的情况,没有规定栈长。
int PushLinkedStack(LinkedStack * linkedStack,ElementType element){
//创建一个新结点
StackNode *newNode=(StackNode *)malloc(sizeof(StackNode));
newNode->data=element;
//新结点的next指向当前的栈顶
newNode->next=linkedStack->top;
linkedStack->top=newNode;
linkedStack->length++;
return true;
}
//链栈的出栈
//定义一个临时指针结点,来记录原栈顶结点
int PopLinkedStack(LinkedStack * linkedStack,ElementType * element){
if(linkedStack->top==NULL){
printf("空栈,出栈操作失败");
return false;
}
//返回栈顶元素
*element=linkedStack->top->data;
//记录出栈操作前的栈顶指针
StackNode * node=linkedStack->top;
//栈顶指针下移一位
linkedStack->top=linkedStack->top->next;
//释放原栈顶空间
free(node);
linkedStack->length--;
return true;
}
//清空栈,遍历栈中的每一个元素并释放结点空间
void ClearLinkedStack(LinkedStack * linkedStack){
StackNode *tempNode;//临时变量
while(linkedStack->top){
tempNode=linkedStack->top;//栈顶指向下一个元素
linkedStack->top=linkedStack->top->next;
free(tempNode);
linkedStack->length--;
}
}
//销毁栈
//先清空栈,再销毁栈
void DestroyLinkedStack(LinkedStack * linkedStack){
ClearLinkedStack(linkedStack);
free(linkedStack);
linkedStack=NULL;
}
#include <iostream>
using namespace std;
#include "LinkedStack.h"
ElementType datas[]={
{1,"哈哈哈"},
{2,"哇哇哇"},
{3,"呵呵呵"},
{4,"啦啦啦"}
};
void TestSeqStack();
int main(){
TestSeqStack();
}
void TestSeqStack(){
LinkedStack * stack=(LinkedStack *)malloc(sizeof(LinkedStack));
ElementType *element=(ElementType *)malloc(sizeof(ElementType));
InitLinkedStack(stack);
for(int i=0;i<4;i++){
printf("当前入栈:%d\t%s\n",datas[i].id,datas[i].name);
PushLinkedStack(stack,datas[i]);
}
PopLinkedStack(stack,element);
printf("当前出栈的元素:%d\t%s\n",element->id,element->name);
PopLinkedStack(stack,element);
}