链栈与单链表类似,区别在于其相关操作只能在栈顶操作
#include <stdio.h>
#include <stdlib.h>
//栈的链存储
//栈的一个节点
typedef struct stackNode{
int data;
struct stackNode *next;
}LinkStackPtr;
//构造一个栈:栈顶指针和栈底指针
typedef struct{
LinkStackPtr *top; //指向栈顶的指针
LinkStackPtr *bottom; //栈底指针
}LinkStack;
//初始化一个空栈
LinkStack *InitStack(LinkStack *S)
{
S = (LinkStack *)malloc(sizeof(LinkStack));
if (S ==NULL)
{
exit(-1);
}
S->bottom = NULL;
S->top = NULL;
return S;
}
//创建第一个元素
LinkStack *CreatStack(LinkStack *S, int data)
{
InitStack(S);
S->bottom = (LinkStackPtr *)malloc(sizeof(LinkStackPtr));
if (S->bottom == NULL)
{
exit(-1);
}
S->top = S->bottom;
S->top->data = data;
S->top->next = NULL;
return S;
}
//将一个个元素压入栈中
void PushNodeToStack(LinkStack *S, int data)
{
LinkStackPtr *p;
p = (LinkStackPtr *)malloc(sizeof(LinkStackPtr));
if (p == NULL)
{
exit(-1);
}
p->data = data;
p->next = S->top;
S->top = p;
}
//将一个元素出栈
void PopNodeToStack(LinkStack *S, int *data)
{
LinkStackPtr *p;
p = (LinkStackPtr *)malloc(sizeof(LinkStackPtr));
if (p == NULL)
{
exit(-1);
}
*data = S->top->data;
p = S->top;
S->top = S->top->next;
free(p);
}
//输出一个栈
int PrintStack(LinkStack *S)
{
if ((S->bottom == NULL) && (S->top == NULL))
{
printf("空栈\n");
return 0;
}
if (S->bottom == S->top && S->top != NULL)
{
printf("栈中的元素为:%d\n", S->top->data);
return 0;
}
LinkStackPtr *p;
p = S->top;
printf("栈中的元素:\n");
while (p != S->bottom)
{
printf("%d\n",p->data);
p = p->next;
}
if ( p == S->bottom)
{
printf("%d",p->data);
}
printf("\n");
return 0;
}
int main()
{
int p;
LinkStack *my_stack;
my_stack = InitStack(my_stack);
my_stack = CreatStack(my_stack,1);
PrintStack(my_stack);
PushNodeToStack(my_stack,8);
PushNodeToStack(my_stack,8);
PushNodeToStack(my_stack,8);
PrintStack(my_stack);
PopNodeToStack(my_stack,&p);
PrintStack(my_stack);
return 0;
}
测试后的输出结果;
栈中的元素为:1
栈中的元素:
8
8
8
1
栈中的元素:
8
8
1