链栈基本操作
- 格式:doc
- 大小:31.50 KB
- 文档页数:7
一、实验目的1. 理解栈的定义、特点、逻辑结构及其在计算机科学中的应用。
2. 掌握顺序栈和链栈的存储结构及基本操作实现。
3. 通过具体应用实例,加深对栈的理解,提高问题分析和解决的能力。
二、实验内容1. 实现顺序栈和链栈的基本操作。
2. 编写一个算法,判断给定的字符序列是否为回文。
3. 编写一个算法,利用栈的基本运算将指定栈中的内容进行逆转。
4. 给定一个整数序列,实现一个求解其中最大值的递归算法。
三、实验步骤1. 实现顺序栈和链栈的基本操作(1)顺序栈的存储结构及操作实现顺序栈使用数组来实现,其基本操作包括:- 初始化栈:使用数组创建一个空栈,并设置栈的最大容量。
- 入栈:将元素插入栈顶,如果栈满,则返回错误。
- 出栈:从栈顶删除元素,如果栈空,则返回错误。
- 获取栈顶元素:返回栈顶元素,但不删除。
- 判断栈空:判断栈是否为空。
(2)链栈的存储结构及操作实现链栈使用链表来实现,其基本操作包括:- 初始化栈:创建一个空链表,作为栈的存储结构。
- 入栈:在链表头部插入元素,如果链表为空,则创建第一个节点。
- 出栈:删除链表头部节点,如果链表为空,则返回错误。
- 获取栈顶元素:返回链表头部节点的数据。
- 判断栈空:判断链表是否为空。
2. 判断字符序列是否为回文编写一个算法,判断给定的字符序列是否为回文。
算法步骤如下:(1)使用顺序栈或链栈存储字符序列。
(2)从字符序列的头部开始,依次将字符入栈。
(3)从字符序列的尾部开始,依次将字符出栈,并与栈顶元素比较。
(4)如果所有字符均与栈顶元素相等,则字符序列为回文。
3. 利用栈的基本运算将指定栈中的内容进行逆转编写一个算法,利用栈的基本运算将指定栈中的内容进行逆转。
算法步骤如下:(1)创建一个空栈,用于存储逆转后的栈内容。
(2)从原栈中依次将元素出栈,并依次入新栈。
(3)将新栈的内容赋值回原栈,实现栈内容的逆转。
4. 求解整数序列中的最大值给定一个整数序列,实现一个求解其中最大值的递归算法。
不带头结点的链栈的基本操作链栈是一种常见的数据结构,它具有后进先出(LIFO)的特点,类似于现实生活中的栈。
链栈的实现方式有多种,其中一种是不带头结点的链栈。
本文将介绍不带头结点的链栈的基本操作,包括初始化、入栈、出栈、获取栈顶元素以及判断栈是否为空。
1. 初始化链栈初始化链栈时,需要创建一个空的链表。
可以通过定义一个指向链表头结点的指针来实现。
初始状态下,该指针为空,表示链栈为空。
2. 入栈操作入栈操作是将一个元素插入到链栈的栈顶。
首先需要创建一个新的结点,将要入栈的元素存储在该结点中。
然后,将新结点插入到链栈的栈顶,并更新链栈的指针。
具体步骤如下:- 创建一个新的结点,并将要入栈的元素存储在该结点中。
- 将新结点的指针指向链栈的栈顶元素。
- 更新链栈的指针,使其指向新的栈顶元素。
3. 出栈操作出栈操作是将链栈的栈顶元素删除,并返回该元素的值。
首先需要判断链栈是否为空,如果为空则无法进行出栈操作。
如果链栈不为空,则将栈顶元素删除,并更新链栈的指针。
具体步骤如下:- 判断链栈是否为空,如果为空则无法进行出栈操作,返回错误信息。
- 如果链栈不为空,则将链栈的栈顶元素保存到一个临时变量中。
- 更新链栈的指针,使其指向下一个栈顶元素。
- 返回保存的栈顶元素的值。
4. 获取栈顶元素获取栈顶元素操作是返回链栈的栈顶元素的值,而不删除该元素。
首先需要判断链栈是否为空,如果为空则无法获取栈顶元素。
如果链栈不为空,则返回链栈的栈顶元素的值。
具体步骤如下:- 判断链栈是否为空,如果为空则无法获取栈顶元素,返回错误信息。
- 如果链栈不为空,则返回链栈的栈顶元素的值。
5. 判断栈是否为空判断栈是否为空操作是检查链栈是否为空,即链栈中是否存在元素。
首先需要判断链栈的指针是否为空,如果为空则链栈为空,否则链栈不为空。
具体步骤如下:- 判断链栈的指针是否为空,如果为空则链栈为空,返回真;否则链栈不为空,返回假。
通过以上的基本操作,可以实现不带头结点的链栈的各种功能。
不带头结点的链栈的基本操作不带头结点的链栈是一种常见的数据结构,具有一些基本操作,包括入栈、出栈、获取栈顶元素和判断栈是否为空。
下面将详细介绍这些基本操作。
1. 入栈操作入栈操作是将一个元素添加到链栈的栈顶。
具体步骤如下:(1)创建一个新节点,将要入栈的元素存储在该节点中。
(2)将新节点的next指针指向当前栈顶节点。
(3)将新节点设为新的栈顶节点。
2. 出栈操作出栈操作是将链栈的栈顶元素移除,并返回该元素的值。
具体步骤如下:(1)判断链栈是否为空,若为空则无法进行出栈操作。
(2)将当前栈顶节点的元素值保存到一个临时变量中。
(3)将栈顶节点的next指针指向下一个节点。
(4)释放原来的栈顶节点。
(5)返回保存的临时变量。
3. 获取栈顶元素获取栈顶元素操作是返回链栈的栈顶元素的值,但不移除该元素。
具体步骤如下:(1)判断链栈是否为空,若为空则无法获取栈顶元素。
(2)返回栈顶节点的元素值。
4. 判断栈是否为空判断栈是否为空操作是检查链栈是否为空。
具体步骤如下:(1)若链栈的栈顶节点为NULL,则链栈为空,返回True;否则,返回False。
以上是不带头结点的链栈的基本操作。
下面通过一个简单的示例来演示这些操作的使用。
假设有一个不带头结点的链栈,初始时为空。
我们可以依次进行入栈、出栈、获取栈顶元素和判断栈是否为空的操作。
我们进行入栈操作,依次将元素1、2、3入栈。
此时链栈的状态如下:栈顶->3->2->1->NULL然后,我们进行出栈操作,依次将栈顶的元素移除。
出栈操作的结果为3、2、1。
此时链栈的状态为空。
接着,我们进行获取栈顶元素的操作,发现栈为空,无法获取栈顶元素。
我们进行判断栈是否为空的操作,发现栈为空,返回True。
通过以上示例,我们可以看到不带头结点的链栈的基本操作是非常简单的。
入栈操作将元素添加到栈顶,出栈操作将栈顶元素移除,获取栈顶元素操作返回栈顶元素的值,判断栈是否为空操作检查链栈是否为空。
一、实验目的1. 掌握栈的定义、特点、逻辑结构,理解栈的抽象数据类型。
2. 熟练掌握顺序栈和链栈两种结构类型的定义、特点以及基本操作的实现方法。
3. 了解栈在解决实际问题中的应用。
二、实验内容1. 编写顺序栈和链栈的基本操作函数,包括入栈(push)、出栈(pop)、判断栈空(isEmpty)、获取栈顶元素(getTop)等。
2. 利用栈实现字符序列是否为回文的判断。
3. 利用栈实现整数序列中最大值的求解。
三、实验步骤1. 创建顺序栈和链栈的结构体,并实现相关的基本操作函数。
2. 编写一个函数,用于判断字符序列是否为回文。
该函数首先将字符序列中的字符依次入栈,然后逐个出栈,比较出栈的字符是否与原序列相同,若相同则表示为回文。
3. 编写一个函数,用于求解整数序列中的最大值。
该函数首先将序列中的元素依次入栈,然后逐个出栈,每次出栈时判断是否为当前栈中的最大值,并记录下来。
四、实验结果与分析1. 顺序栈和链栈的基本操作函数实现如下:```c// 顺序栈的基本操作void pushSeqStack(SeqStack s, ElemType x) {if (s->top < MAXSIZE - 1) {s->top++;s->data[s->top] = x;}}void popSeqStack(SeqStack s, ElemType x) {if (s->top >= 0) {x = s->data[s->top];s->top--;}}bool isEmptySeqStack(SeqStack s) {return s->top == -1;}ElemType getTopSeqStack(SeqStack s) {if (s->top >= 0) {return s->data[s->top];}return 0;}// 链栈的基本操作void pushLinkStack(LinkStack s, ElemType x) {LinkStack p = (LinkStack )malloc(sizeof(LinkStack)); if (p == NULL) {exit(1);}p->data = x;p->next = s->top;s->top = p;}void popLinkStack(LinkStack s, ElemType x) { if (s->top != NULL) {LinkStack p = s->top;x = p->data;s->top = p->next;free(p);}}bool isEmptyLinkStack(LinkStack s) {return s->top == NULL;}ElemType getTopLinkStack(LinkStack s) {if (s->top != NULL) {return s->top->data;}return 0;}```2. 判断字符序列是否为回文的函数实现如下:```cbool isPalindrome(char str) {SeqStack s;initStack(&s);int len = strlen(str);for (int i = 0; i < len; i++) {pushSeqStack(&s, str[i]);}for (int i = 0; i < len; i++) {char c = getTopSeqStack(&s);popSeqStack(&s, &c);if (c != str[i]) {return false;}}return true;}```3. 求解整数序列中最大值的函数实现如下:```cint getMax(int arr, int len) {LinkStack s;initStack(&s);int max = arr[0];for (int i = 0; i < len; i++) {pushLinkStack(&s, arr[i]);if (arr[i] > max) {max = arr[i];}}while (!isEmptyLinkStack(&s)) {popLinkStack(&s, &max);}return max;}```五、实验心得通过本次实验,我对栈的基本操作有了更深入的理解。
栈的概念理解栈是一种数据结构,它是一种特殊的线性表,只能在表的一端进行插入和删除操作,该一端被称为栈顶,另一端被称为栈底。
栈的特点是后进先出(Last In First Out, LIFO)。
在栈中,最后插入的元素最先弹出,而最先插入的元素最后弹出。
这就好像是一堆盘子,你只能在最上面放盘子和拿盘子,不能随意放在下面的盘子上。
栈的这种特性使得它非常适合解决一些具有“倒序”需求的问题。
栈的基本操作包括入栈和出栈。
入栈(Push)是指将元素放入栈顶;出栈(Pop)是指从栈顶弹出元素。
除此之外,还有一些常用的操作,比如获取栈顶元素(Top)、判断栈是否为空(Empty)、获取栈中元素的个数(Size)等。
栈的实现可以用数组或链表来完成。
使用数组实现的栈叫作顺序栈,使用链表实现的栈叫作链式栈。
对于顺序栈,我们需要定义一个数组和一个整数来表示栈。
数组用于存储栈中的元素,整数用于记录栈顶元素的下标。
一开始,栈为空,栈顶下标可以初始化为-1。
插入元素时,需要判断栈是否已满,如果已满则无法插入;如果未满,将元素放入栈顶,同时栈顶下标加1。
删除元素时,需要判断栈是否为空,如果为空则无法删除;如果不为空,将栈顶元素弹出,并将栈顶下标减1。
对于链式栈,我们需要定义一个结构体来表示栈中的节点。
节点包括一个数据域和一个指向下一个节点的指针域。
和顺序栈类似,链式栈也需要一个指针来表示栈顶元素。
插入元素时,需要创建一个新节点,并将栈顶指针指向该节点,新节点的指针域指向原来的栈顶元素。
删除元素时,需要判断栈是否为空,如果为空则无法删除;如果不为空,将栈顶节点删除,并将栈顶指针指向下一个节点。
栈的应用非常广泛。
在计算机科学中,栈是一种重要的数据结构,它被用于实现函数调用、表达式求值、编译器的语法分析、操作系统的进程管理等。
在编程中,我们可以使用栈来解决一些具有“倒序”性质的问题,比如字符串反转、括号匹配、计算逆波兰表达式等。
此外,栈还被用于图的深度优先搜索(DFS)算法中的节点遍历顺序。
栈的基本操作代码引言栈(Stack)是一种常见的数据结构,具有后进先出(Last In First Out,LIFO)的特性。
栈的基本操作包括入栈(Push)、出栈(Pop)、获取栈顶元素(Top)和判断栈是否为空(IsEmpty)。
本文将详细介绍栈的基本操作代码及其实现。
一、栈的定义栈是一种线性数据结构,仅允许在一端进行插入和删除操作。
这一端被称为栈顶,另一端称为栈底。
栈的插入操作叫做入栈,删除操作叫做出栈。
栈的特性决定了最后插入的元素最先删除。
二、栈的基本操作2.1 入栈(Push)入栈操作将一个元素添加到栈的栈顶。
具体实现如下:class Stack:def __init__(self):self.stack = []def push(self, item):self.stack.append(item)2.2 出栈(Pop)出栈操作将栈顶元素删除并返回。
具体实现如下:class Stack:def __init__(self):self.stack = []def push(self, item):self.stack.append(item)def pop(self):if not self.is_empty():return self.stack.pop()else:return None2.3 获取栈顶元素(Top)获取栈顶元素操作不改变栈的结构,仅返回栈顶元素的值。
具体实现如下:class Stack:def __init__(self):self.stack = []def push(self, item):self.stack.append(item)def pop(self):if not self.is_empty():return self.stack.pop()else:return Nonedef top(self):if not self.is_empty():return self.stack[-1]else:return None2.4 判断栈是否为空(IsEmpty)判断栈是否为空操作用于检测栈内是否还有元素。
栈的操作(实验报告范文)栈的基本操作,附带源程序实验三栈和队列3.1实验目的:(1)熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈的基本操作在栈的顺序存储结构和链式存储结构上的实现;(2)熟悉队列的特点(先进先出)及队列的基本操作,如入队、出队等,掌握队列的基本操作在队列的顺序存储结构和链式存储结构上的实现。
3.2实验要求:(1)复习课本中有关栈和队列的知识;(2)用C语言完成算法和程序设计并上机调试通过;(3)撰写实验报告,给出算法思路或流程图和具体实现(源程序)、算法分析结果(包括时间复杂度、空间复杂度以及算法优化设想)、输入数据及程序运行结果(必要时给出多种可能的输入数据和运行结果)。
3.3基础实验[实验1]栈的顺序表示和实现实验内容与要求:编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:(1)初始化顺序栈(2)插入元素(3)删除栈顶元素(4)取栈顶元素(5)遍历顺序栈(6)置空顺序栈分析:栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表。
对于顺序栈,入栈时,首先判断栈是否为满,栈满的条件为:p->top==MA某NUM-1,栈满时,不能入栈;否则出现空间溢出,引起错误,这种现象称为上溢。
出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。
通常栈空作为一种控制转移的条件。
注意:(1)顺序栈中元素用向量存放(2)栈底位置是固定不变的,可设置在向量两端的任意一个端点(3)栈顶位置是随着进栈和退栈操作而变化的,用一个整型量top (通常称top为栈顶指针)来指示当前栈顶位置参考程序:#include<tdio.h>#include<tdlib.h>#defineMA某NUM20栈的基本操作,附带源程序#defineElemTypeint/某定义顺序栈的存储结构某/ typedeftruct{ElemTypetack[MA某NUM]; inttop;}SqStack;/某初始化顺序栈某/voidInitStack(SqStack某p){if(!p)printf("Eorror");p->top=-1;}/某入栈某/voidPuh(SqStack某p,ElemType某){if(p->top<MA某NUM-1){p->top=p->top+1;p->tack[p->top]=某;}eleprintf("Overflow!\n");}/某出栈某/ElemTypePop(SqStack某p){ElemType某;if(p->top!=0){某=p->tack[p->top];printf("以前的栈顶数据元素%d已经被删除!\n",p->tack[p->top]);p->top=p->top-1;return(某);}ele{printf("Underflow!\n");return(0);}}/某获取栈顶元素某/ ElemTypeGetTop(SqStack某p) {ElemType某;if(p->top!=0){某=p->tack[p->top];return(某);}ele{printf("Underflow!\n");栈的基本操作,附带源程序return(0);}}/某遍历顺序栈某/ voidOutStack(SqStack某p) {inti;if(p->top<0)printf("这是一个空栈!");printf("\n");for(i=p->top;i>=0;i--)printf("第%d个数据元素是:%6d\n",i,p->tack[i]); }/某置空顺序栈某/voidetEmpty(SqStack某p){p->top=-1;}/某主函数某/main(){SqStack某q;inty,cord;ElemTypea;do{printf("\n");printf("第一次使用必须初始化!\n");printf("\n主菜单\n");printf("\n1初始化顺序栈\n");printf("\n2插入一个元素\n");printf("\n3删除栈顶元素\n");printf("\n4取栈顶元素\n");printf("\n5置空顺序栈\n");printf("\n6结束程序运行\n");printf("\n--------------------------------\n"); printf("请输入您的选择(1,2,3,4,5,6)");canf("%d",&cord);printf("\n");witch(cord){cae1:{q=(SqStack某)malloc(izeof(SqStack));InitStack(q);OutStack(q);}break;cae2:栈的基本操作,附带源程序{printf("请输入要插入的数据元素:a="); canf("%d",&a);Puh(q,a);OutStack(q);}break;cae3:{Pop(q);OutStack(q);}break;cae4:{y=GetTop(q);printf("\n栈顶元素为:%d\n",y); OutStack(q);}break;cae5:{etEmpty(q);printf("\n顺序栈被置空!\n"); OutStack(q);}break;cae6:e某it(0);}}while(cord<=6);}[实验2]栈的链式表示和实现实验内容与要求:编写一个程序实现链栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能:(1)初始化链栈(2)链栈置空(3)入栈(4)出栈(5)取栈顶元素(6)遍历链栈分析:链栈是没有附加头结点的运算受限的单链表。
链栈的基本操作链栈是一种特殊的栈结构,它的存储方式是链式存储,而不是顺序存储。
链栈的基本操作包括初始化、入栈、出栈、获取栈顶元素和判断栈是否为空。
下面将详细介绍这些操作的实现方法和应用场景。
一、初始化链栈初始化链栈就是创建一个空栈,通常需要定义一个头结点,并将链表的头指针指向头结点。
头结点不存储数据,只作为链表的起始点。
二、入栈操作入栈操作是将一个元素添加到链栈的栈顶。
具体步骤如下:1. 创建一个新的结点,将要入栈的元素存储在结点的数据域中。
2. 将新结点的指针域指向链表的头指针所指向的结点。
3. 更新链表的头指针,使其指向新结点。
入栈操作的时间复杂度为O(1),即常数时间。
三、出栈操作出栈操作是将链栈的栈顶元素删除,并返回其值。
具体步骤如下:1. 判断链栈是否为空,如果为空则无法进行出栈操作。
2. 将链表的头指针指向的结点删除,并保存其数据域的值。
3. 更新链表的头指针,使其指向被删除结点的下一个结点。
4. 返回被删除结点的数据域的值。
出栈操作的时间复杂度为O(1),即常数时间。
四、获取栈顶元素获取栈顶元素操作是返回链栈的栈顶元素的值,但不删除该元素。
具体步骤如下:1. 判断链栈是否为空,如果为空则无法获取栈顶元素。
2. 返回链表的头指针所指向的结点的数据域的值。
获取栈顶元素操作的时间复杂度为O(1),即常数时间。
五、判断栈是否为空判断栈是否为空操作是检查链栈是否为空栈,即链表中是否只有头结点。
具体步骤如下:1. 判断链表的头指针是否为空,如果为空则链栈为空栈。
2. 如果链表的头指针不为空,则链栈不为空栈。
判断栈是否为空操作的时间复杂度为O(1),即常数时间。
链栈的基本操作可以应用于很多场景,例如:1. 表达式求值:将中缀表达式转换为后缀表达式,然后利用链栈进行后缀表达式的求值。
2. 浏览器的前进和后退功能:使用两个链栈分别保存浏览器的前进和后退历史记录。
3. 括号匹配:利用链栈对输入的括号进行匹配判断,判断括号是否闭合正确。
在使用C语言实现链栈(链式栈)时,判断栈是否满的问题一般不涉及,因为链栈的长度理论上可以是无限的,不存在溢出的问题。
链栈通过动态内存分配来存储元素,只要内存充足,就可以一直入栈。
链栈通常包含一个头结点和指向栈顶的指针,入栈时在链表头插入新元素,出栈时删除头结点。
由于链栈不受固定空间限制,栈满的情况几乎不会发生。
以下是一个简单的C语言链栈的实现示例,用于说明链栈的基本结构:#include <stdio.h>#include <stdlib.h>// 定义链栈节点结构struct Node {int data;struct Node* next;};// 定义链栈结构struct Stack {struct Node* top; // 栈顶指针};// 初始化链栈void initStack(struct Stack* stack) {stack->top = NULL;}// 判断链栈是否为空int isEmpty(struct Stack* stack) {return stack->top == NULL;}// 入栈操作void push(struct Stack* stack, int value) {struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));newNode->data = value;newNode->next = stack->top;stack->top = newNode;}// 出栈操作int pop(struct Stack* stack) {if (isEmpty(stack)) {printf("Stack is empty.\n");return -1; // 表示栈空}struct Node* temp = stack->top;int value = temp->data;stack->top = temp->next;free(temp);return value;}// 打印栈中元素void printStack(struct Stack* stack) { struct Node* current = stack->top;while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");}int main() {struct Stack stack;initStack(&stack);push(&stack, 10);push(&stack, 20);push(&stack, 30);printf("Stack elements: ");printStack(&stack);int poppedValue = pop(&stack);printf("Popped value: %d\n", poppedValue);printf("Stack elements after popping: ");printStack(&stack);return 0;}在链栈中,一般不会显式判断栈是否满,因此无需专门的栈满判断函数。
链栈基本操作
#include<stdio.h>
#include<stdlib.h>
#define OK 0
#define ERROR 1
int MAX_SIZE = 20;
// 顺序栈的表示方法
typedef struct {
int* pData; // top=-1表示栈为空, top范围-1~MAX_SIZE
int top; //top=MAX_SIZE-1表示栈满
}SeqStack;
SeqStack* InitList(SeqStack* L)
{
if (NULL==L)
{
L=(SeqStack*)malloc(sizeof(SeqStack)); //为L开辟空间}
if (!L)
{
printf("初始化失败!\n"); //开辟失败输出的提示
return NULL;
}
L->pData=(int*)malloc(MAX_SIZE*sizeof(int)); //为栈开辟空间if(!L->pData)
{
free(L); //如果开辟失败释放L的空间
printf("初始化失败!\n");
return NULL;
L->top=-1; //栈为空
return L;
}
// 顺序栈的销毁
int DestroyList(SeqStack* L)
{
if(L->pData)
{
free(L->pData); //释放栈的空间
L->pData=NULL;
}
L->top=-1; //栈置空
return 1;
}
// 获取栈顶元素
int GetTop(SeqStack* L)
{
if(-1==L->top)
{
printf("栈已空!\n"); //如果L->pData等于-1则栈是空的
exit(1);
}
return L->pData[L->top]; //返回栈顶元素
}
// 出栈操作
int Pop(SeqStack* L)
{
if(-1==L->top)
printf("栈已空!\n"); //如果L->pData等于-1则栈是空的
exit(1);
}
return L->pData[L->top--]; //返回栈顶元素,栈顶减1
}
// 入栈操作
int Push(SeqStack *L, int x)
{
if(!L->pData || L->top>=MAX_SIZE-1)
{
printf("顺序栈不存在或是栈已满, 不能插入!"); //如果栈顶等于栈元素最大个数,则栈已满
return ERROR;
}
L->top++; //栈顶加1
*(L->pData+L->top)=x; //要入栈的元素放入栈顶
return OK;
}
// 输出某个数据
void PrintDataType(int x)
{
printf("%d", x); //输出传过来的元素
printf("\n");
}
// 输出顺序栈中的每个元素
void PrintList(SeqStack* L)
{
int k=0;
if(!L->pData)
printf("顺序栈不存在!\n"); //如果L->pData为0,则栈不存在
return;
}
if(-1==L->top)
{
printf("顺序栈是空的!\n"); //如果栈顶为-1 ,则栈为空
return;
}
printf("栈中的元素有:\n");
for(k=0; k<=L->top; k++)
{
PrintDataType(L->pData[k]); //调用PrintDataType()函数,输出栈中的的值
}
}
// 置空栈
int SetEmpty(SeqStack* L)
{
if(!L->pData)
{
return ERROR;
}
L->top=-1; //站定赋值-1,栈置空
return OK;
}
// 求栈中元素个数
int GetCnt(SeqStack* L)
{
if(L->pData)
{
return L->top+1;
}
return -1; // 顺序栈没有分配内存时, 返回-1 }
// 判断是否为空: 1为空, 0为非空
int IsEmpty(SeqStack* L)
{
if(!L->pData)
{
printf("顺序栈不存在!\n");
}
return -1==L->top;
}
// 判断是否为满: 1为满, 0为不满
int IsFull(SeqStack* L)
{
if(!L->pData)
{
printf("顺序栈不存在!\n");
}
return MAX_SIZE==L->top+1;
}
void main()
{
SeqStack* L=NULL;
L=InitList(L); // 初始化顺序栈
PrintList(L); // 打印顺序栈
printf("插入三个元素后");
Push(L, 10); // 把元素10入栈
Push(L, 12); // 把元素12入栈
Push(L, 14); // 把元素14入栈
PrintList(L); // 打印顺序栈
printf("栈顶元素为:");
PrintDataType(GetTop(L));
printf("岀栈元素为:");
PrintDataType(Pop(L));
PrintList(L); // 打印顺序栈
printf("栈顶元素为:");
PrintDataType(GetTop(L));
if(IsEmpty(L)){
printf("顺序栈是空的\n");
}else{
printf("顺序栈是非空的\n");
}
printf("置空栈后");
SetEmpty(L); // 把顺序栈置空
PrintList(L); // 打印顺序栈
DestroyList(L); // 不要忘了
printf("栈已销毁!\n");
PrintList(L); // 打印顺序栈
if (NULL!=L)
free(L);
}。