运行结果:
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
//定义bool型变量
#define true 1
#define false 0
#define bool int
//这里定义栈中的元素都是int类型
typedef int ElemType;
//链栈的定义
typedef struct LinkNode {
ElemType data;
struct LinkNode* next;
}LinkNode;
typedef struct LinkNode* LiStack;
//初始化一个栈,带头结点
bool InitStack(LiStack* S) {
*S = (LinkNode*)malloc(sizeof(LinkNode));
if (*S == NULL)
return false;
(*S)->next = NULL;
return true;
}
//判断一个栈是否为空,若为空,返回true;不为空,返回false
bool StackEmpty(LiStack S) {
if (S->next == NULL)
return true;
else
return false;
}
//向栈中插入元素e
bool Push(LiStack* S, ElemType e) {
LinkNode* n = (LinkNode*)malloc(sizeof(LinkNode));
//内存分配失败的情况
if (n == NULL)
return false;
n->data = e;
n->next = (*S)->next;
(*S)->next = n;
return true;
}
//出栈操作,返回被删除的栈顶元素的值
bool Pop(LiStack* S, ElemType* e) { //e是一个指针变量,指向被删除的元素的值
//若栈为空,则无法删除,返回false
if ((*S)->next == NULL)
return false;
//p是第一个结点,即栈顶结点
LinkNode* p = (*S)->next;
*e = p->data;
(*S)->next = p->next;
//释放第一个结点
free(p);
return true;
}
//读取栈顶元素
bool GetTop(LiStack* S, ElemType* e) { //e是一个指针变量,指向被删除的元素的值
//若栈为空,则无法删除,返回false
if ((*S)->next == NULL)
return false;
*e = (*S)->next->data;
return true;
}
//main函数
int main() {
LiStack mystack;
InitStack(&mystack);
//判断是否为空
printf("栈是否为空:1:空;0:不空。%d\n", StackEmpty(mystack));
//依次向栈中插入1,3,4,6,7,10
Push(&mystack, 1);
Push(&mystack, 3);
Push(&mystack, 4);
Push(&mystack, 6);
Push(&mystack, 7);
Push(&mystack, 10);
//获取栈顶元素
ElemType x;
GetTop(&mystack, &x);
printf("栈顶元素为:%d\n", x);
//删除栈顶元素
ElemType d;
Pop(&mystack,&d);
printf("删除的栈顶元素为:%d\n", d);
//重新获取栈顶元素
GetTop(&mystack, &x);
printf("栈顶元素为:%d\n", x);
return 0;
}