数据结构与算法之链式栈

简介: 链式栈的使用本篇博客遇上篇博客不同,不需要加条件判断栈是否为满,为了提高效率我们可以使用链表的前插法来表示栈,整体使用方法和单链表类似

链式栈的使用

本篇博客遇上篇博客不同,不需要加条件判断栈是否为满,为了提高效率我们可以使用链表的前插法来表示栈,整体使用方法和单链表类似

/*数据结构与算法之 栈的链式存储
实验目的:
(1) 实现栈的存储结构设计;
(2) 实现栈的操作算法设计;
(3) 利用栈实现应用问题的解决;
实验内容:
栈的初始化 
打印栈内所有元素 
 判断栈空 
 入栈和出栈算法设计;
*/
#include<iostream>
#include<Windows.h>
using namespace std;
static int length = 0;
typedef struct _LqStack {
  int data;
  struct _LqStack *next;  //指向下一节点的指针
}LqStack,LqNode;
//初始化链式栈
bool InitLq(LqStack* &Lq) {
  Lq = new LqStack;
  if (!Lq) return false;
  Lq->data = -1;
  Lq->next = NULL;
  return true;
}
//前插法入队
bool push(LqStack* &Lq, LqNode *s) {
  if (!Lq) return false;
  s->next = Lq->next;
  Lq->next = s;
  length++;
  return true;
}
//打印链表
void PrintLq(LqStack* &Lq) {
  if (!Lq) return ;
  LqStack *p = Lq->next;
  cout << "链式栈的元素依次是: ";
  while (p) {
    cout << p->data << " ";
    p = p->next;
  }
  return;
}
//出栈
bool PopLq(LqStack* &Lq, int &Element) {
  if (!Lq) return false;
  LqStack *p = Lq;
  if (Lq->next == NULL) {
    cout << "这是个空栈!  " << endl;
    return false;
  }
    Lq = Lq->next;
    Element = Lq->data;
    delete p;
    p = Lq;
    length--;
  return true;
}
int main(void) {
  LqStack *Lq;
  LqNode *s;
  if (InitLq(Lq)) {
    cout << "初始化链式栈成功! " << endl;
  } else {
    cout << "初始化链式栈失败! " << endl;
  }
  int num;  //入栈的个数
  int Element;  //记录出栈元素的值
  cout << "请输入你想要入栈的个数: ";
  cin >> num;
  //入栈,使用链式存储
  for (int i = 0; i < num; i++) {
    s = new LqNode;
    cout << "请输入你想要插入的元素: ";
    cin >> s->data;
    if (push(Lq, s)) {
      cout << "链式栈插入元素成功!  插入的元素是:  "<<s->data << endl;
    } else {
      cout << "链式栈插入元素失败! " << endl;
    }
  }
  //打印链式栈
  PrintLq(Lq);
  cout << "现在栈的个数是: " << length << endl;
  //出栈
  cout << "请输入你想要出栈的个数: ";
  cin >> num;
  for (int i = 0; i < num; i++) {
    if (PopLq(Lq, Element)) {
      cout << "出栈成功!  出栈的元素是: " << Element << endl;
    } else {
      cout << "出栈失败! " << endl;
    }
  }
  PrintLq(Lq);
  cout << "现在栈的个数是: " << length << endl;
  //栈的初始化 打印栈内所有元素  判断栈空 入栈和出栈算法设计;
  system("pause");
  return 0;
}

       20191014224716116.png                        

目录
相关文章
|
6月前
|
存储 NoSQL C语言
数据结构——顺序栈与链式栈的实现-2
数据结构——顺序栈与链式栈的实现
数据结构——顺序栈与链式栈的实现-2
|
6月前
|
存储 C语言
数据结构——顺序栈与链式栈的实现-1
数据结构——顺序栈与链式栈的实现
数据结构——顺序栈与链式栈的实现-1
|
缓存 C语言
【数据结构】栈的基本概念 | 从零开始实现数组栈 | 画图解析 | 数组栈与链式栈
本章我们将学习 "栈" ,首先介绍栈的概念和结构,然后我们将着重讲解数组栈的实现。我们从零开始写数组栈的接口,并从零开始步步解读。本章旨在筑牢栈知识点的基础,对后续的刷题有着很大的帮助。
168 0
【数据结构】栈的基本概念 | 从零开始实现数组栈 | 画图解析 | 数组栈与链式栈
|
存储
数据结构基础(13) --链式栈的设计与实现
    采用链式存储的栈成为链式栈(或简称链栈), 链栈的优点是便于多个栈共享存储空间和提高其效率, 且不存在栈满上溢的情况(因为链栈是靠指针链接到一起,只要内存够大, 则链栈理论上可以存储的...
1085 0
|
3天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
50 9
|
16小时前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
2天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
21 4
|
26天前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
26 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
6天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
25天前
初步认识栈和队列
初步认识栈和队列
54 10