链栈
用的是C语言不是C++,编译器vs2019,出现的 scanf_s() 在vs需要,如果复制到其他地方可以改成 scanf()
严蔚敏教材-算法3.5-3.8
链栈的存储结构
//存储结构
typedef struct StackNode {
Elemtype data;
struct StackNode* next;
}StackNode,*LinkStack;
算法 3.5:链栈的初始化
//算法 3.5:链栈的初始化
Status InitStack(LinkStack* S) {
//构造一个空栈S,栈顶指针置空
S = NULL;
return OK;
}
算法 3.6:链栈的入栈
//算法 3.6:链栈的入栈
LinkStack Push(LinkStack S, SElemType e) {
//在栈顶插入元素 e
StackNode* p = (StackNode*)malloc(sizeof(StackNode));
if (!p) {
printf("新建结点p失败\n");
return ERROR;
}
p->data = e; //新结点数据域置位 e
p->next = S; //新结点插入栈顶
S = p; //修改栈顶指针为 p
return S;
}
算法 3.7:链栈的出栈
//算法 3.7:链栈的出栈
LinkStack Pop(LinkStack S, SElemType* e) {
//删除 S 的栈顶元素,用 e 返回其值
if (S == NULL) {
printf("Pop == NULL\n");
return ERROR;
}
*e = S->data; //将栈顶元素赋值给 e
StackNode* p = S; //用 p 临时保存栈顶元素空间,以备释放
S = S->next; //修改栈顶指针
free(p); //释放原栈顶元素空间
return S;
}
算法 3.8:取栈顶元素
//算法 3.8:取栈顶元素
SElemType GetTop(LinkStack S) {
if (S != NULL) //栈非空
return S->data; //返回栈顶元素,栈顶指针不变
}
链栈测试程序
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ERROR -1
#define OK 1
#define Elemtype int
#define Status int
#define SElemType int
//存储结构
typedef struct StackNode {
Elemtype data;
struct StackNode* next;
}StackNode,*LinkStack;
Status InitStack(LinkStack* S);
LinkStack Push(LinkStack S, SElemType e);
LinkStack Pop(LinkStack S, SElemType* e);
int main(void)
{
int E,*e = &E;
int i = 1;
//初始化栈
LinkStack S;
InitStack(&S);
//入栈
printf("输入第 %d 个进栈元素(q退出):",i);
while (scanf_s("%d", e) != NULL && i++) {
S = Push(S, *e);
printf("输入第 %d 个进栈元素(q退出):",i);
}
printf("\n");
//查看栈顶元素
int a = GetTop(S);
printf("栈顶元素为:%d\n\n", a);
//全部出栈
for (int n = 1; i > 1;i--) {
S = Pop(S, e);
printf("第 %d 个栈内元素为:%d\n",i, *e);
}
system("pause");
return EXIT_SUCCESS;
}
//算法 3.5:链栈的初始化
Status InitStack(LinkStack* S) {
//构造一个空栈S,栈顶指针置空
S = NULL;
return OK;
}
//算法 3.6:链栈的入栈
LinkStack Push(LinkStack S, SElemType e) {
//在栈顶插入元素 e
StackNode* p = (StackNode*)malloc(sizeof(StackNode));
if (!p) {
printf("新建结点p失败\n");
return ERROR;
}
p->data = e; //新结点数据域置位 e
p->next = S; //新结点插入栈顶
S = p; //修改栈顶指针为 p
return S;
}
//算法 3.7:链栈的出栈
LinkStack Pop(LinkStack S, SElemType* e) {
//删除 S 的栈顶元素,用 e 返回其值
if (S == NULL) {
printf("Pop == NULL\n");
return ERROR;
}
*e = S->data; //将栈顶元素赋值给 e
StackNode* p = S; //用 p 临时保存栈顶元素空间,以备释放
S = S->next; //修改栈顶指针
free(p); //释放原栈顶元素空间
return S;
}
//算法 3.8:取栈顶元素
SElemType GetTop(LinkStack S) {
if (S != NULL) //栈非空
return S->data; //返回栈顶元素,栈顶指针不变
}