栈-链表-不带头结点

1. **栈的结构定义:**
   - `LNode` 结构体定义了链表节点,包含一个整数 `data` 存储数据,以及一个指向下一个节点的指针 `next`。
   - `LinkStack` 是指向链表栈的指针。

2. **初始化栈:**
   - `Stack_Init` 函数用于初始化栈,将栈顶指针 `pStack` 置为 `NULL` 表示空栈。

3. **判断栈是否为空:**
   - `Stack_Empty` 函数通过判断栈顶指针 `pStack` 是否为 `NULL` 来判断栈是否为空。

4. **获取栈有效数据节点个数:**
   - `Stack_Length` 函数遍历链表栈,计算链表节点的数量,即栈的长度。

5. **创建栈:**
   - `Stack_Create` 函数通过输入数据创建栈,每输入一个数据,创建一个新节点并插入到链表的头部。

6. **新元素入栈:**
   - `Stack_Push` 函数将新元素入栈,创建一个新节点,并将其插入到链表的头部。

7. **出栈:**
   - `Stack_Pop` 函数将栈顶元素出栈,首先检查栈是否为空,然后删除栈顶节点,并释放相应的内存。

8. **返回栈顶元素:**
   - `Stack_Get_Top` 函数返回指向栈顶元素的指针。

9. **打印栈所有值:**
   - `Stack_Show` 函数遍历链表栈,打印所有节点的数据。

10. **主函数演示:**
   - 主函数演示了栈的初始化、入栈、出栈、获取栈顶元素等操作,并输出相应的结果。

#include <stdio.h>
#include <stdlib.h>

typedef struct LNode {
  int data;
  struct LNode *next;
} LNode, *LinkStack;

// 初始化栈
bool Stack_Init(LinkStack &pStack) {
  pStack = NULL;
  return true;
}

// 判断栈是否为空
bool Stack_Empty(LinkStack pStack) {
  return pStack == NULL;
}

// 获取栈有效数据节点个数
int Stack_Length(LinkStack pStack) {
  int length = 0;
  LNode *current = pStack;
  while (current != NULL) {
    length++;
    current = current->next;
  }
  return length;
}

// 创建栈
LinkStack Stack_Create(LinkStack &pStack) {
  LNode *pTemp;
  int x;
  scanf("%d", &x);
  while (x != 999) {
    pTemp = (LNode *)malloc(sizeof(LNode));
    pTemp->data = x;
    pTemp->next = pStack;
    pStack = pTemp;
    scanf("%d", &x);
  }
  return pStack;
}

// 新元素入栈
bool Stack_Push(LinkStack &pStack, int e) {
  LNode *pTemp = (LNode *)malloc(sizeof(LNode));
  pTemp->data = e;
  pTemp->next = pStack;
  pStack = pTemp;
  return true;
}

// 出栈
bool Stack_Pop(LinkStack &pStack, int &e) {
  if (pStack == NULL) return false;
  LNode *p = pStack;
  e = p->data;
  pStack = pStack->next;
  free(p);
  return true;
}

// 返回第一个
LNode *Stack_Get_Top(LinkStack pStack) {
  return pStack;
}

// 打印栈所有值
void Stack_Show(LinkStack pStack) {
  LNode *node = pStack;
  printf("栈值:");
  while (node != NULL) {
    printf("%d、", node->data);
    node = node->next;
  }
  printf("\n");
}

int main() {
  int i = -1;
  LinkStack pStack;
  Stack_Init(pStack);
  printf("栈判空:%s\n", Stack_Empty(pStack) ? "空" : "非空");

  Stack_Push(pStack, 1);
  Stack_Push(pStack, 2);
  Stack_Push(pStack, 3);
  Stack_Push(pStack, 4);
  Stack_Show(pStack);

  Stack_Pop(pStack, i);
  printf("出栈:%d\n", i);
  Stack_Show(pStack);

  Stack_Pop(pStack, i);
  printf("出栈:%d\n", i);
  Stack_Show(pStack);

  Stack_Pop(pStack, i);
  printf("出栈:%d\n", i);
  Stack_Show(pStack);

  printf("栈长度:%d\n\n", Stack_Length(pStack));

  printf("栈判空:%s\n", Stack_Empty(pStack) ? "空" : "非空");
  return 0;
}

  • 26
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值