/**
* 实现链栈各种基本运算的算法
* 目的:
* 领会链栈存储结构和掌握链栈中各种基本运算算法设计
* 主要功能:
* 1、初始化栈s
* 2、判断栈s是否非空
* 3、依次进栈元素a、b、c、d、e
* 4、判断栈s是否非空
* 5、输出栈序列
* 6、判断栈s是否非空
* 7、释放栈
*/
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
typedef char ElemType;
typedef struct linknode
{
ElemType data; // 数据域
struct linknode *next; // 指针域
}LinkStNode; // 链栈类型定义
/*----------------------初始化链栈------------------------*/
static void init_stack(LinkStNode *&s) // 指针的引用
{
s = (LinkStNode *)malloc(sizeof(LinkStNode));
s->next = NULL;
}
/*----------------------销毁链栈------------------------*/
static void destroy_stack(LinkStNode *&s)
{
LinkStNode *p = s->next;
while(p != NULL)
{
free(s);
s = p;
p = p->next;
}
free(s); // s指向尾结点,释放其空间
}
/*----------------------判断栈空否------------------------*/
static bool stack_empty(LinkStNode *s)
{
return (s->next == NULL);
}
/*----------------------入栈------------------------*/
static void push(LinkStNode *&s, ElemType e)
{
LinkStNode *p;
p = (LinkStNode *)malloc(sizeof(LinkStNode));
p->data = e; // 新建元素e对应的结点p
p->next = s->next; // 插入p结点作为开始结点
s->next = p;
}
/*----------------------出栈------------------------*/
static bool pop(LinkStNode *&s, ElemType &e) // 指针的引用
{
LinkStNode *p;
if(s->next == NULL) // 栈空的情况
return false;
p = s->next; // p指向开始结点
e = p->data; // 提取数据
s->next = p->next; // 删除p结点
free(p); // 释放p结点
return true;
}
/*----------------------取栈顶元素------------------------*/
static bool get_top(LinkStNode *s, ElemType &e)
{
if(s->next == NULL) // 栈空的情况
return false;
e = s->next->data;
return true;
}
int main(int argc, char *argv[])
{
ElemType e;
LinkStNode *s;
printf("链栈s的基本运算如下:\n");
printf(" (1)初始化栈s\n");
init_stack(s);
printf(" (2)栈为%s\n", (stack_empty(s) ? "空" : "非空"));
printf(" (3)依次进栈元素a,b,c,d,e\n");
push(s, 'a');
push(s, 'b');
push(s, 'c');
push(s, 'd');
push(s, 'e');
printf(" (4)栈为%s\n", (stack_empty(s) ? "空" : "非空"));
printf(" (5)出栈序列:");
while(!stack_empty(s))
{
pop(s, e);
printf("%c ", e);
}
printf("\n");
printf(" (6)栈为%s\n", (stack_empty(s) ? "空" : "非空"));
printf(" (7)释放栈\n");
destroy_stack(s);
return 0;
}
运算结果:
链栈s的基本运算如下:
(1)初始化栈s
(2)栈为空
(3)依次进栈元素a,b,c,d,e
(4)栈为非空
(5)出栈序列:e d c b a
(6)栈为空
(7)释放栈