//链栈
#pragma once
#include <stdbool.h>
typedef struct LNode
{
int data;
//struct LNode *top; //不许要栈顶指针,总是第一个数据节点
struct LNode *next;
}LNode, *PLStack;
//初始化
void InitStack(PLStack ps);
//入栈
bool Push(PLStack ps, int val);
//获取栈顶的值,但不删除栈顶元素
bool GetTop(PLStack ps, int *rtval);
//出栈,获取栈顶的值,且删除栈顶元素
bool Pop(PLStack, int *rtval);
//判空
bool IsEmpty(PLStack ps);
//清除
void Clear(PLStack ps);
//销毁
void Destory(PLStack ps);
//链栈
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include "istack.h"
/*
typedef struct LNode
{
int data;
//struct LNode *top; //不许要栈顶指针,总是第一个数据节点
struct LNode *next;
}LNode, *PLStack;
*/
//初始化
void InitStack(PLStack ps)
{
assert(ps != NULL);
ps->next = NULL;
}
//入栈
bool Push(PLStack ps, int val)
{
assert(ps != NULL);
LNode *p = (LNode *)malloc(sizeof(LNode));
p->data = val;
p->next = ps->next;
ps->next = p;
return true;
}
//获取栈顶的值,但不删除栈顶元素
bool GetTop(PLStack ps, int *rtval)
{
assert(ps != NULL);
if(IsEmpty(ps))
{
return false;
}
if(rtval != NULL)
{
*rtval = ps->next->data;
}
return true;
}
//出栈,获取栈顶的值,且删除栈顶元素
bool Pop(PLStack ps, int *rtval)
{
assert(ps != NULL);
if(IsEmpty(ps))
{
return false;
}
if(rtval != NULL)
{
*rtval = ps->next->data;
free(ps->next->data);
}
}
//判空
bool IsEmpty(PLStack ps)
{
assert(ps != NULL);
return ps->next == NULL;
}
//清除
void Clear(PLStack ps)
{
assert(ps != NULL);
ps->next == 0;
}
//销毁
void Destory(PLStack ps)
{
assert(ps != NULL);
free(ps->next);
ps->next = 0;
// ps->data == NULL;
}
#include <stdio.h>
#include "istack.h"
int main()
{
LNode ds;
InitStack(&ds);
int tmp;
for(int i = 0; i < 20; i++)
{
Push(&ds,i);
}
// Show(&ds);
while(!IsEmpty(&ds))
{
Pop(&ds,&tmp);
printf("%d\n", tmp);
}
Destory(&ds);
return 0;
}