链栈的优点是便于多个栈的共享存储空间和提高其效率,链栈就是一个头插法并且在头部删除的单链表,需要注意的是带头结点和不带头节点的处理并不相同,我这里是带头结点的。
#include<stdio.h>
#include<stdlib.h>
#define maxsize 10
#define initsize 10
#pragma warning(disable:4996)
#pragma warning(disable:5208)
//链栈的定义
typedef struct Stack
{
int data;
struct Stack* next;
}*LinkStack,Snode;
//链栈的初始化
int InitStack(LinkStack& S)
{
S = new Snode;
if (S == NULL)return -1;//表示申请失败
S->next = NULL;
return 1;//头结点置空
}
//链栈的判空
int IsStackEmpty(LinkStack S)
{
if (S->next == NULL)return 1;//若下一个指向为空则栈空
return 0;
}
//链栈的入栈(头插法)
int PushStack(LinkStack& S, int e)
{
Snode* p, * s;
p = S;
s = new Snode;
s->data = e;
s->next = p->next;
p->next = s;
return 1;
}
//链栈的出栈
int PopStack(LinkStack&S,int &e)
{
Snode* p, * s;
p = S;
if (p->next == NULL)return 0;//说明表空
s = new Snode;
s = p->next;
e = s->data;
p->next = s->next;
delete s;
return 1;
}
//求栈顶元素
int GetTop(LinkStack& S, int& e)
{
if (S->next == NULL)return 0;//说明表空
e = S->next->data;//返回栈头的数据
return 1;
}
int DestroyStack(LinkStack& S, int& e)
{
Snode* p;
while (S->next)
{
p = S->next;
S->next = p->next;
delete p;
}
S->next = NULL;
printf("成功销毁");
return 1;
}
int main()
{
LinkStack S;
int i, e;
printf("链栈初始化:%d\n", InitStack(S));
printf("链栈的判空:%d\n", IsStackEmpty(S));
printf("入栈\n");
for (i = 1; i <= 10; i++)
{
PushStack(S, i);
}
printf("链栈的判空:%d\n", IsStackEmpty(S));
e = GetTop(S, e);
printf("栈顶的元素是%d", e);
printf("链栈的出栈:");
for (i = 1; i <= 10; i++)
{
PopStack(S, e);
printf("%d ", e);
}
printf("\n链栈的判空:%d\n", IsStackEmpty(S));
return 1;
}