typedef int SElemType;
typedef struct StackNode {//结点
SElemType data;//数据域
struct StackNode* next;//指针域
}StackNode, * LinkStackPtr;
//由于栈有栈顶,可以直接把栈顶指针与链表头指针合二为一,因此此处链栈没有头结点,top即头指针
typedef struct {
LinkStackPtr top;//栈顶指针
int count;
}LinkStack;
1、初始化
//初始化
bool InitStack(LinkStack* S) {
S->top = (LinkStackPtr)malloc(sizeof(struct StackNode));
if (!S->top) {
return false;
}
S->top = NULL;
S->count = 0;
return true;
}
2、判断是否为空
//判断是否为空栈
bool StackEmpty(LinkStack S) {
if (S.count == 0) {
return true;
}
else {
return false;
}
}
3、求栈的长度
//求栈的长度
int StackLength(LinkStack S) {
return S.count;
}
4、进栈
//进栈
bool Push(LinkStack* S, SElemType X) {
LinkStackPtr s = (LinkStackPtr)malloc(sizeof(struct StackNode));
if (!s) {
return false;
}
s->data = X;
s->next = S->top;
S->top = s;
S->count++;
return true;
}
5、出栈
//出栈
bool Pop(LinkStack* S, SElemType* e) {
if (StackEmpty(*S)) {
return false;
}
LinkStackPtr p;
*e = S->top->data;//被删除元素放入e中
p = S->top;
S->top = S->top->next;
free(p);
S->count--;
return true;
}
6、返回栈顶元素
//返回栈顶元素
bool GetTop(LinkStack S, SElemType* e) {
if (S.top == NULL) {
return false;
}
else {
*e = S.top->data;
return true;
}
}
7、输出链栈
//输出链栈
void DisStack(LinkStack S) {
LinkStackPtr p;
p = S.top;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
8、完整+测试程序
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdbool.h>
typedef int SElemType;
typedef struct StackNode {//结点
SElemType data;//数据域
struct StackNode* next;//指针域
}StackNode, * LinkStackPtr;
//由于栈有栈顶,可以直接把栈顶指针与链表头指针合二为一,因此此处链栈没有头结点,top即头指针
typedef struct {
LinkStackPtr top;//栈顶指针
int count;
}LinkStack;
//初始化
bool InitStack(LinkStack* S) {
S->top = (LinkStackPtr)malloc(sizeof(struct StackNode));
if (!S->top) {
return false;
}
S->top = NULL;
S->count = 0;
return true;
}
//判断是否为空栈
bool StackEmpty(LinkStack S) {
if (S.count == 0) {
return true;
}
else {
return false;
}
}
//求栈的长度
int StackLength(LinkStack S) {
return S.count;
}
//进栈
bool Push(LinkStack* S, SElemType X) {
LinkStackPtr s = (LinkStackPtr)malloc(sizeof(struct StackNode));
if (!s) {
return false;
}
s->data = X;
s->next = S->top;
S->top = s;
S->count++;
return true;
}
//出栈
bool Pop(LinkStack* S, SElemType* e) {
if (StackEmpty(*S)) {
return false;
}
LinkStackPtr p;
*e = S->top->data;//被删除元素放入e中
p = S->top;
S->top = S->top->next;
free(p);
S->count--;
return true;
}
//返回栈顶元素
bool GetTop(LinkStack S, SElemType* e) {
if (S.top == NULL) {
return false;
}
else {
*e = S.top->data;
return true;
}
}
//输出链栈
void DisStack(LinkStack S) {
LinkStackPtr p;
p = S.top;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
//TEST
int main(void) {
LinkStack S;
int j, e;
int flag = InitStack(&S);
if (flag) {
for (j = 1; j <= 10; j++) {
Push(&S, j);
}
}
printf("栈中元素依次为:");
DisStack(S);//输出
Pop(&S, &e);
printf("弹出的栈顶元素为%d\n", e);
GetTop(S, &e);
printf("栈顶元素为%d 栈的长度为%d\n", e, StackLength(S));
printf("栈中元素依次为:");
DisStack(S);//输出
return 0;
}
9、结果