![在这里插入图片描述](https://img-blog.csdnimg.cn/e586528ec8be4d7d9f61f57f08462fcb.png)
1.操作菜单
![在这里插入图片描述](https://img-blog.csdnimg.cn/1baf6a7cf6834a27add20a9fa7556e3c.png)
2.初始化
- 注意初始化的要给下一个结点赋值为NULL
void init(LinkNodeStack& stack) {
stack = (LinkNodeStack)malloc(sizeof(LinkNode));
stack->nextNode = NULL;
return;
}
3.栈空
bool empty(LinkNodeStack stack) {
return stack->nextNode == NULL;
}
4.进栈
void insert(LinkNodeStack& stack , ElemType data) {
LinkNodeStack temp = stack->nextNode;
LinkNodeStack node = (LinkNodeStack)malloc(sizeof(LinkNode));
node->nextNode = NULL;
node->data = data;
if (temp == NULL) {
stack->nextNode = node;
}
else {
node->nextNode = stack->nextNode;
stack->nextNode = node;
}
}
5.出栈
- 注意出栈的时候剩余结点的个数。
- 注意删除的时候,将链表接起来。
bool delElem(LinkNodeStack &stack, ElemType &getElemData) {
LinkNodeStack temp = stack->nextNode;
if (!empty(stack)) {
if (temp->nextNode==NULL) {
getElemData = temp->data;
free(temp);
stack->nextNode = NULL;
}
else {
LinkNodeStack deleteNode = temp;
temp->nextNode = deleteNode->nextNode;
getElemData = deleteNode->data;
stack->nextNode = deleteNode->nextNode;
free(deleteNode);
}
return true;
}
else {
return false;
}
}
6.读取栈顶元素
bool getElemTop(LinkNodeStack stack,ElemType &getElemTop) {
if (empty(stack)) {
return false;
}
else {
getElemTop = stack->nextNode->data;
return true;
}
}
7.栈的长度
int length(LinkNodeStack stack) {
LinkNodeStack temp = stack->nextNode;
int i = 0;
while (temp!=NULL) {
i++;
temp = temp->nextNode;
}
return i;
}
8.查看栈
void printStack(LinkNodeStack stack) {
LinkNodeStack temp = stack->nextNode;
int i = 0;
while (temp != NULL) {
printf("stack[%d] = %d\n", i++, temp->data);
temp = temp->nextNode;
}
}
9.完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct LinkNode {
ElemType data;
struct LinkNode *nextNode;
}LinkNode, *LinkNodeStack;
void choice(LinkNodeStack& stack);
void menu(LinkNodeStack& stack);
void init(LinkNodeStack& stack);
void insert(LinkNodeStack& stack, ElemType data);
void printStack(LinkNodeStack stack);
bool delElem(LinkNodeStack& stack);
bool empty(LinkNodeStack stack);
int getElemTop(LinkNodeStack stack);
int length(LinkNodeStack stack);
void menu(LinkNodeStack &stack) {
printf("-----------------栈的顺序存储结构-----------------\n");
printf(" 1.初始化 \n");
printf(" 2.栈空 \n");
printf(" 3.进栈 \n");
printf(" 4.出栈 \n");
printf(" 5.读取栈顶元素 \n");
printf(" 6.栈的长度 \n");
printf(" 7.查看栈 \n");
choice(stack);
}
bool getElemTop(LinkNodeStack stack,ElemType &getElemTop) {
if (empty(stack)) {
return false;
}
else {
getElemTop = stack->nextNode->data;
return true;
}
}
int length(LinkNodeStack stack) {
LinkNodeStack temp = stack->nextNode;
int i = 0;
while (temp!=NULL) {
i++;
temp = temp->nextNode;
}
return i;
}
bool empty(LinkNodeStack stack) {
return stack->nextNode == NULL;
}
bool delElem(LinkNodeStack &stack, ElemType &getElemData) {
LinkNodeStack temp = stack->nextNode;
if (!empty(stack)) {
if (temp->nextNode==NULL) {
getElemData = temp->data;
free(temp);
stack->nextNode = NULL;
}
else {
LinkNodeStack deleteNode = temp;
temp->nextNode = deleteNode->nextNode;
getElemData = deleteNode->data;
stack->nextNode = deleteNode->nextNode;
free(deleteNode);
}
return true;
}
else {
return false;
}
}
void init(LinkNodeStack& stack) {
stack = (LinkNodeStack)malloc(sizeof(LinkNode));
stack->nextNode = NULL;
return;
}
void insert(LinkNodeStack& stack , ElemType data) {
LinkNodeStack temp = stack->nextNode;
LinkNodeStack node = (LinkNodeStack)malloc(sizeof(LinkNode));
node->nextNode = NULL;
node->data = data;
if (temp == NULL) {
stack->nextNode = node;
}
else {
node->nextNode = stack->nextNode;
stack->nextNode = node;
}
}
void printStack(LinkNodeStack stack) {
LinkNodeStack temp = stack->nextNode;
int i = 0;
while (temp != NULL) {
printf("stack[%d] = %d\n", i++, temp->data);
temp = temp->nextNode;
}
}
void choice(LinkNodeStack& stack) {
int choice = 0;
int len;
ElemType insertData;
ElemType getElemTopData;
ElemType getDeleteData;
bool isEmpty;
bool isGetElem;
bool getTopData;
printf("请输入你的选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
init(stack);
printf("初始化完成\n");
break;
case 2:
isEmpty = empty(stack);
printf(isEmpty == true ? "栈空\n" : "栈不空\n");
break;
case 3:
printf("请输入你要添加的值:");
scanf("%d", &insertData);
insert(stack, insertData);
break;
case 4: {
isGetElem = delElem(stack, getDeleteData);
if (isGetElem) {
printf("出栈成功\n");
printf("取出的元素为:%d\n", getDeleteData);
}
else {
printf("读取失败\n");
}
break;
}
case 5: {
getTopData = getElemTop(stack, getElemTopData);
if (getTopData) {
printf("读取成功\n");
printf("读取的元素为%d\n", getElemTopData);
}
else {
printf("读取失败\n");
}
break;
}
case 6:
len = length(stack);
printf("长度为%d\n",len);
break;
case 7:
printStack(stack);
break;
}
menu(stack);
}
int main() {
LinkNodeStack stack;
menu(stack);
return 0;
}
10.思想
- 和单链表类似,只是这里的出栈变成了单链表的删除操作,而且每次删除的是头结点后面的一个结点。
- 其他的功能点都和单链表差不多。