编写一个程序实现链栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:
(1)初始化链栈
(2)链栈置空
(3)入栈
(4)出栈
(5)取栈顶元素
(6)遍历链栈
链栈的功能实现:
#include <stdio.h>
#include <malloc.h>
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
typedef struct node
{
ElemType data;
struct node *next;
}StackNode;
typedef struct
{
StackNode *top;
}LinkStack;
//初始化
void InitStack(LinkStack *s)
{
s->top = NULL;
puts("链栈初始化完成!");
}
//将链栈置空
Status SetEmpty(LinkStack *s)
{
StackNode *p = s->top;
while(p)
{
s->top = p->next;
free(p);
p = s->top;
}
puts("链栈已置空!");
return OK;
}
//压栈
Status Push(LinkStack *s, ElemType e)
{
StackNode *p;
p = (StackNode *)malloc(sizeof(StackNode));
p->data = e;
p->next = s->top;//把要压入的元素内存单元的next指针指向栈顶
s->top = p;//栈顶指向新压入的元素内存单元
return OK;
}
//弹栈
Status Pop(LinkStack *s, ElemType *e)
{
StackNode *p = s->top;
if(s->top == NULL)
{
puts("栈空, 不能进行弹栈操作!");
return ERROR;
}
s->top = p->next;//让栈顶指针指向前一个元素,
*e = p->data;
free(p);//释放栈顶元素内存空间
return OK;
}
Status GetTop(LinkStack *s, ElemType *e)
{
if(s->top == NULL)
{
puts("栈空, 无栈顶元素!");
return ERROR;
}
*e = s->top->data;
return OK;
}
//打印栈
Status PrintStack(LinkStack *s)
{
StackNode *p;
p = s->top;
while(p)
{
printf("%d ", p->data);
p = p->next;
}
puts("");
return OK;
}
测试代码段
int main()
{
LinkStack s;
InitStack(&s);
int n, e;
printf("请输入链栈长度:\n");
scanf("%d", &n);
puts("请输入要录入的数据:");
while(n--)
{
int x;
scanf("%d", &x);
Push(&s, x);
}
PrintStack(&s);
GetTop(&s, &e);
printf("栈顶元素为:%d\n",e);
puts("8入栈后:");
Push(&s,8);
PrintStack(&s);
Pop(&s, &e);
printf("弹栈元素是:%d\n", e);
puts("弹栈后:");
PrintStack(&s);
SetEmpty(&s);
return 0;
}
运行结果: