#include <iostream>
#include <stdlib.h>
using namespace std;
typedef int Elemtype;
typedef struct Node {
Node *lNext;
Elemtype eData;
} *LinkedStack;
//函数声明
LinkedStack initNode();
void showStack(LinkedStack);
void initStack(LinkedStack , int);
int stackLength(LinkedStack);
bool isEmptyStack(LinkedStack);
Elemtype getTop(LinkedStack);
void push(LinkedStack , Elemtype);
Elemtype pop(LinkedStack);
void clearStack(LinkedStack);
int main()
{
LinkedStack ls = initNode();
cout << "输入要初始化栈空间的元素个数:" << endl;
int iSize;
cin >> iSize;
cout << "输入各个元素值:" << endl;
initStack(ls , iSize);
cout << "栈内元素有:" << endl;
showStack(ls);
//测试求栈空间元素个数函数
//cout << "栈空间元素个数为:" << stackLength(ls) << endl;
//判断栈空间是否为空
/*bool bEmpty = isEmptyStack(ls);
if(bEmpty) {
cout << "栈空间里面没有任何元素!" << endl;
} else {
cout << "栈非空!" << endl;
}*/
//测试获取栈顶元素
/*Elemtype eReturn = getTop(ls);
cout << "栈顶元素为:" << eReturn << endl;*/
//测试入栈函数
/*Elemtype eValue;
cout << "输入要入栈的元素值:" << endl;
cin >> eValue;
push(ls , eValue);
cout << "入栈后,栈空间元素值为:" << endl;
showStack(ls);*/
//测试出栈函数
Elemtype eDelete = pop(ls);
cout << "被删除元素为:" << eDelete << endl;
cout << "栈空间剩余元素:" << endl;
showStack(ls);
//测试置空栈
cout << "置空栈……" << endl;
clearStack(ls);
showStack(ls);
return 0;
}
//初始化结点
LinkedStack initNode() {
LinkedStack lReturn = (LinkedStack)malloc(sizeof(Node));
lReturn->lNext = NULL;
return lReturn;
}
//初始化栈
void initStack(LinkedStack lHead , int iSize) {
if(lHead->lNext != NULL) {
lHead->lNext = NULL;
}
for(int i = 0; i < iSize; i++) {
Elemtype eValue;
cin >> eValue;
push(lHead , eValue);
}
}
//求栈空间元素个数
int stackLength(LinkedStack lHead) {
int length = 0;
while(lHead->lNext != NULL) {
length++;
lHead = lHead->lNext;
}
return length;
}
//显示栈空间所有值
void showStack(LinkedStack lHead) {
if(isEmptyStack(lHead)) {
cout << "栈空间里面没有元素!" << endl;
return;
}
lHead = lHead->lNext;
while(lHead != NULL) {
cout << lHead->eData << " ";
lHead = lHead->lNext;
}
cout << endl;
}
//判断栈空间是否为空
bool isEmptyStack(LinkedStack lHead) {
if(lHead->lNext == NULL) {
return true;
}
return false;
}
//读取栈顶元素
Elemtype getTop(LinkedStack lHead) {
if(isEmptyStack(lHead)) {
cout << "栈空间没有任何元素!" << endl;
return -1;
}
return lHead->lNext->eData;
}
//入栈
void push(LinkedStack lHead , Elemtype eValue) {
LinkedStack lNew = initNode();
lNew->eData = eValue;
lNew->lNext = lHead->lNext;
lHead->lNext = lNew;
}
//出栈
Elemtype pop(LinkedStack lHead) {
if(isEmptyStack(lHead)) {
cout << "栈空间没有任何元素!" << endl;
return -1;
}
LinkedStack lDelete = lHead->lNext;
lHead->lNext = lDelete->lNext;
Elemtype eReturn = lDelete->eData;
free(lDelete);
return eReturn;
}
//置空栈
void clearStack(LinkedStack lHead) {
if(isEmptyStack(lHead)) {
return;
}
while(!isEmptyStack(lHead)) {
LinkedStack lDelete = lHead->lNext;
lHead->lNext = lDelete->lNext;
free(lDelete);
}
}
//销毁栈
void destoryStack(LinkedStack lHead) {
clearStack(lHead);
free(lHead);
}
分享到:
相关推荐
1.请使用链栈实现通用数制转换程序:将任意一个十进制数转换成p进制的数。(p分别取2,8,16) 2. 假定一个单向循环链表来表示队列(即循环链队),该队列只设一个队尾指针rear,不设队首指针,试编写下列各种运算...
《链栈实现与走迷宫问题——MFC演示程序解析》 在计算机科学领域,算法设计与实现常常涉及一些有趣的实际应用,如走迷宫问题。本篇文章将深入探讨如何利用链栈这一数据结构来解决老鼠迷宫问题,并结合MFC...
### 使用链栈实现链队列逆置 #### 领域背景 在计算机科学与软件工程领域中,数据结构和算法是极其重要的基础知识之一。它们不仅帮助开发者有效地组织和处理数据,还能通过优化数据访问方式来提高程序的性能。本文...
**链栈实现反序输出的步骤:** 1. 创建一个空的链栈。 2. 将输入序列的每个元素依次压入链栈。 3. 当链栈非空时,进行以下操作: - 弹出链栈的栈顶元素(即原序列的最后一个元素)并输出。 - 重复此过程,直到链栈...
### 数据结构实验:括号匹配检验——链栈实现 #### 实验目的与意义 本实验旨在通过具体的编程实践,帮助学生深入理解并掌握数据结构中的链表和栈这两种基本的数据结构,同时学会如何利用栈来解决实际问题之一:...
链栈的实现是数据结构与算法中的一个关键概念,它结合了链表的动态特性与栈的后进先出(LIFO)原则。在给定的代码片段中,我们可以看到链栈的基本操作实现,包括创建、压栈、弹栈、判断空栈、获取栈顶元素、清空栈...
运用链栈实现进制的转换,是老师布置的课堂作业,对栈和链表的学习有帮助
与数组实现的栈不同,链栈不依赖于预先分配的固定大小的内存空间,而是通过链表来动态地存储和管理元素。下面我们将详细介绍链栈的表示、基本操作以及给出相应的C++源码实现。 ### 链栈的表示 链栈的核心是它的...
本文实例为大家分享了C++利用链栈实现表达式求值的具体代码,供大家参考,具体内容如下 #include typedef int Status; typedef char Cstack; #define OK 1 #define ERROR 0 typedef struct StackNode { Cstack ...
在C语言中,链栈的实现通常涉及定义一个结构体类型,用于表示链栈的节点。结构体包括两个部分:一个存储数据的字段和一个指向下一个节点的指针。例如: ```c typedef struct Node { int data; // 假设我们存储的是...
通过理解以上概念并结合提供的代码“链栈操作”,你可以完成数据结构作业中的链栈实现。在实际项目中,链栈可以应用于许多场景,如表达式求值、函数调用堆栈等。熟练掌握链栈操作对于深入理解数据结构和算法至关重要...
这样我们就完成了一个基本的链栈实现。在实际使用中,你可以根据需要扩展这个类,例如增加错误处理、输入输出等其他功能。在C++中,链栈相比数组栈有其优势,例如动态扩展空间、不需要预先知道栈的最大容量等。在...
此外,报告可能会涵盖测试用例,以验证链栈实现的正确性和可靠性。 通过理解这些基本概念和操作,开发者可以更好地掌握数据结构中的链栈,并在实际问题中灵活运用。链栈在算法和程序设计中扮演着重要角色,尤其是在...
链式栈是一种特殊的数据结构,它是栈的一种实现方式,与数组实现的栈相比,具有更大的灵活性,特别是在存储空间的动态扩展方面。在这个“用链式栈实现简易计算器”的项目中,开发者利用C++(混入少量C语言特性)构建...
在进行数据结构实验时,可以设计不同的场景来测试链栈的功能,比如模拟计算器的运算过程,使用链栈处理括号嵌套的问题,或者用链栈实现一个简单的逆波兰表达式求值器。这些实践可以帮助我们更好地理解链栈的工作原理...
本话题聚焦于一种特定的应用——使用C++实现的顺序栈和链栈,将10进制数转换为2、8、16进制。这里我们将深入探讨顺序栈和链栈的概念,以及它们如何应用于不同进制之间的转换。 首先,顺序栈是一种基于数组的数据...
C++语言开发的链栈,使用指针开发,初学者可以作为参考
链栈是一种特殊的线性数据...通过理解这些基本概念和操作,你可以创建自己的链栈实现,处理各种数据结构问题,如表达式求值、括号匹配等。链栈作为基础数据结构,对于理解和掌握更复杂的算法和数据结构有着重要的作用。
链栈是一种基于链表实现的栈,与数组栈不同,链栈在动态扩展和内存管理上具有更大的灵活性。 链栈由一系列节点组成,每个节点包含一个数据元素(在这里是表达式的操作数或运算符)和指向下一个节点的指针。栈的基本...