不多废话啦
直接上代码
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef struct StackNode {
ElemType data;
struct StackNode* next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack {
LinkStackPtr top;
int count;
};
int Push(LinkStack* s, ElemType e);
int Pop(LinkStack* s, ElemType* e);
头文件中就是一些链表结构体的定义和函数的声明,没有什么多说的
#include "Link_head.h"
#include <stdlib.h>
int Push(LinkStack* s, ElemType e)
{
LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode));
p->data = e;
p->next = s->top;
s->top = p;
return OK;
}
int Pop(LinkStack* s, ElemType* e)
{
if (s->top== NULL)
return ERROR;
LinkStackPtr p = s->top;
*e = s->top->data;
s->top = s->top->next;
free(p);
return OK;
}
这是函数文件中的函数实现。
Push
这三步是最重要的,也就是入栈的过程:
- 存入数据
- 将元素插入栈顶
- 刷新栈顶指针
p->data = e;
p->next = s->top;
s->top = p;
Pop
出栈也是三步:
- 取出栈顶元素
- 栈顶指针后移
- 释放原来栈顶元素
*e = s->top->data;
s->top = s->top->next;
free(p);
这就是基本的入栈和出栈操作了,然后我们再在主函数中调用就可以实现栈了。是不是很简单!嘿嘿
#include "Link_head.h"
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
struct LinkStack* s = (LinkStack*)malloc(sizeof(LinkStack));
ElemType data;
s->top = NULL;
s->count = 0;
scanf_s("%d",&data);
while (data) {
if (Push(s, data) == ERROR)
printf("入栈失败!\n\r");
scanf_s("%d", &data);
}
while (Pop(s, &data) == OK) {
printf("data:%d\n\r", data);
}
return 0;
}
这就是测试的代码了,先初始化一个栈,然后入栈出栈,当然有代码怎么能没有调试结果呢?
大家可以明显看到,这个数据是先进后出的。
再见喽!