栈的基本操作与应用

合集下载

栈的总结以及体会

栈的总结以及体会

栈的总结以及体会
栈是一种常用的数据结构,常用于程序的调用栈、表达式求值、深度优先搜索等场景。

栈的特点是先进后出,只允许在栈顶进行操作。

以下是对栈的总结和体会:
1. 实现方式:栈可以通过数组或链表来实现。

数组实现简单,但需要指定固定大小;链表实现可以动态调整大小,但需要额外的内存空间来保存指针信息。

2. 基本操作:栈的基本操作包括入栈(push)、出栈(pop)、获取栈顶元素(top)、判空(isEmpty)等。

操作的时间复杂
度均为O(1)。

3. 应用场景:栈在计算机科学中有广泛的应用。

例如,程序调用栈用于存储函数的局部变量和返回地址;表达式求值中使用栈来转换中缀表达式为后缀表达式,并利用后缀表达式进行运算;深度优先搜索中使用栈来维护待访问的节点。

4. 栈的优点:由于栈的特点,它在某些场景下能够提供高效的解决方案。

例如,在递归算法中,通过使用栈来保存递归的中间结果,可以避免递归的重复计算,提升算法的性能;在编译器的语法分析阶段,可以使用栈来验证括号的匹配情况,确保代码的正确性。

5. 栈的缺点:栈的大小一般是有限制的,当数据量超过栈的容量时,会导致栈溢出。

此外,由于栈是一个内存上的顺序结构,数据的存储是连续的,对于大型数据结构,可能会出现内存分
配不足的问题。

总而言之,栈是一种简单、高效的数据结构,广泛应用于计算机科学的各个领域。

熟练掌握栈的基本操作和相关应用场景,能够帮助我们更好地理解和解决实际问题。

栈的实现及应用实验原理

栈的实现及应用实验原理

栈的实现及应用实验原理一、栈的实现栈是一种先进后出(FILO)的数据结构,它可以被用来实现许多算法和数据结构。

栈可以使用数组或链表来实现。

在这里,我将介绍一下基于数组的栈的实现原理。

1.1 基于数组的栈基于数组的栈实现非常简单,可以使用一个固定大小的数组来存储栈中的元素。

栈具有两个基本操作:压入(push)和弹出(pop)。

在基于数组的栈中,当一个元素压入栈时,它被放入数组的末尾(栈顶),而当一个元素弹出栈时,数组的末尾元素被移除,并返回给调用者。

1.2 实现细节在基于数组的栈中,我们需要跟踪栈顶元素的位置,通常通过一个指示栈顶索引的变量来实现。

当一个元素被压入栈时,我们将它放入数组的栈顶位置,并将栈顶索引加一;当一个元素被弹出栈时,我们将栈顶索引减一,并返回数组中当前栈顶索引位置的元素。

为了避免栈的溢出(stack overflow)或者栈的下溢(stack underflow),我们还需要处理一些边界情况。

例如,在压入元素前,我们需要检查是否数组已满;在弹出元素前,我们需要检查栈中是否有元素。

这些细节需要涵盖在栈的实现中,以保证栈的正确性和健壮性。

1.3 时间复杂度基于数组的栈的时间复杂度非常简单:压入和弹出元素的时间复杂度均为O(1),因为它们只涉及数组末尾的操作。

对于数组的访问(取得栈顶元素)的时间复杂度也为O(1)。

二、栈的应用栈是一种非常重要的数据结构,它在编程中有着广泛的应用。

以下是栈的一些应用实例:2.1 逆波兰表达式逆波兰表达式是一种不包含括号的数学表达式,它使用操作符在操作数之间排列。

逆波兰表达式的计算可以通过栈来实现。

具体地,当遇到一个操作数时,将其压入栈中;当遇到一个操作符时,弹出栈顶的两个元素,并进行相应的计算,将结果压入栈中。

这样,最终栈中剩下的元素就是逆波兰表达式的计算结果。

2.2 括号匹配在编程中,括号匹配是一个非常常见的问题。

给定一个包含括号的字符串,我们需要判断其中的括号是否匹配。

栈基本操作

栈基本操作

栈基本操作栈是一种常见的数据结构,它遵循“先进后出”的原则。

在栈中,数据项只能在栈顶进行插入和删除操作,因此栈的基本操作包括:入栈、出栈、取栈顶元素、判断栈是否为空和清空栈。

一、入栈操作入栈操作是向栈中添加元素的过程。

在入栈操作中,新元素被添加到栈顶位置。

具体实现方法是将新元素压入栈顶,在栈顶添加一个新节点,使其指向旧的栈顶节点。

二、出栈操作出栈操作是从栈中移除元素的过程。

在出栈操作中,栈顶元素被删除,并返回被删除的元素。

具体实现方法是将栈顶元素弹出,使其指向下一个元素,然后返回弹出的元素。

三、取栈顶元素取栈顶元素操作是返回栈顶元素的值,而不删除该元素。

具体实现方法是返回栈顶指针所指向的元素。

四、判断栈是否为空判断栈是否为空操作是检查栈中是否有元素。

具体实现方法是检查栈顶指针是否为NULL。

如果栈顶指针为NULL,则表示栈为空;否则,栈中至少有一个元素。

五、清空栈清空栈操作是将栈中所有元素都删除。

具体实现方法是将栈顶指针设置为NULL,使所有元素都失去了指向下一个元素的指针。

以上就是栈的基本操作。

在实际应用中,栈是一种非常重要的数据结构,常用于递归算法、表达式求值、括号匹配、迷宫问题等领域。

除了上述基本操作外,还有一些较为复杂的栈操作,例如:栈的遍历、栈的排序、栈的合并等等。

在实际应用中,我们需要根据具体的需求选择合适的操作。

需要注意的是,栈是一种线性数据结构,因此它的时间复杂度为O(1),即入栈、出栈、取栈顶元素、判断栈是否为空、清空栈等操作的时间复杂度都为O(1)。

这也是栈被广泛应用的重要原因之一。

栈的基本操作

栈的基本操作

栈的基本操作栈是一种重要的数据结构,它在计算机科学中有着广泛的应用。

对于栈的基本操作,包括入栈(push)、出栈(pop)、获取栈顶元素,以及查看栈的大小(size)等操作。

1.入栈(push)入栈的操作就是往栈里压栈,把元素压入栈顶,以实现入栈操作。

在把元素压入栈时,栈的元素数量会增加1,压入元素的位置就是栈顶。

2.出栈(pop)出栈的操作是从栈顶弹出元素,以实现出栈操作。

当一个元素从栈顶弹出时,栈的大小就会减少1,弹出元素的位置就是栈顶。

3.获取栈顶元素要获取栈顶元素,我们需要从栈中取出元素,但是这并不会改变栈的大小。

由于栈的特性,我们可以通过取出栈顶的元素来获取它,而不需要从栈的其他位置获取。

4.查看栈的大小(size)查看栈的大小也就是查看栈中有多少元素。

要查看栈的大小,我们只要通过查看栈的长度即可,从而知道栈中有多少元素,从而了解栈的大小。

到此,我们对栈的基本操作基本有了一个概念,包括入栈(push)、出栈(pop)、获取栈顶元素以及查看栈的大小(size)。

栈的操作可以用入栈出栈的方式来表示,也可以用推入和弹出的方式来表示,它们都是栈的基本操作。

栈的操作跟其他的数据结构的操作有所不同,比如要存储数据的时候,需要先进行入栈操作,而当要取出数据的时候,需要先进行出栈操作,而不是像队列里面先进行出队操作,再进行入队操作。

栈也可以用来实现字符串操作、算数表达式求值、函数调用以及实现括号的匹配等等,这些都是栈的基本操作的应用。

总而言之,栈是一种重要的数据结构,其基本操作可以说是它的核心。

因此,学习栈的基本操作非常重要,只有掌握了它的基本操作,才可以正确的使用栈这种数据结构。

数据结构-栈基本运算的实现及其应用

数据结构-栈基本运算的实现及其应用

数据结构-栈基本运算的实现及其应用下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!数据结构栈基本运算的实现及其应用在计算机科学和编程中,数据结构是非常重要的概念。

数据结构实验报告栈

数据结构实验报告栈

数据结构实验报告:栈摘要:本实验报告旨在介绍栈这一重要的数据结构,以及在实际应用中的使用。

栈是一种先进后出(LIFO)的数据结构,在计算机科学中有着广泛的应用。

本报告将详细介绍栈的定义、基本操作以及应用实例,并根据实验结果进行分析和总结。

1. 引言栈是一种基于线性表的数据结构,具有后进先出(LIFO)的特性。

它可以通过两个基本操作来实现:push(入栈)将元素添加到栈顶,pop(出栈)将栈顶元素移除。

栈在计算机科学中被广泛应用,如函数调用、表达式求值、括号匹配等。

2. 栈的实现栈可以通过数组或链表来实现。

数组实现的栈称为顺序栈,链表实现的栈称为链式栈。

无论是哪种实现方式,都需要实现以下基本操作:- push(element): 将元素添加到栈顶。

- pop(): 移除栈顶元素并返回。

- top(): 返回栈顶元素的值。

- isEmpty(): 判断栈是否为空。

- isFull(): 判断栈是否已满(仅顺序栈需要实现)。

3. 栈的应用3.1 函数调用栈在函数调用中起着关键作用。

每当一个函数被调用时,当前函数的局部变量、返回地址等信息都会被压入栈中。

当函数执行完毕时,这些信息会从栈中弹出,继续执行上一级函数。

3.2 表达式求值栈常用于表达式求值,特别是中缀表达式的转换和计算。

通过将中缀表达式转换为后缀表达式,可以方便地进行计算。

栈可以临时存储运算符,并根据运算符的优先级进行弹出和计算。

3.3 括号匹配栈的一个重要应用是括号匹配。

通过遍历字符串,将左括号压入栈中。

每当遇到右括号时,如果栈顶元素是匹配的左括号,则弹出栈顶元素;否则,表示括号不匹配。

4. 实验结果与分析根据我们对栈的实现和应用进行的实验,以下是我们得到的结论:- 通过数组实现的顺序栈在空间上存在一定的限制,可能会出现栈溢出的情况。

- 通过链表实现的链式栈没有空间限制,可以动态地添加和删除元素。

- 栈在函数调用和表达式求值中展现出了高效的性能,并能够简化程序的设计。

java栈的用法

java栈的用法Java栈的用法Java栈是一种非常重要的数据结构,它在Java语言中广泛应用于各种场景,例如方法调用、异常处理、表达式求值等。

本文将介绍Java栈的基本概念、常见操作以及实现方式等内容。

一、基本概念1. 栈的定义栈是一种线性数据结构,它具有后进先出(Last In First Out,LIFO)的特点。

栈可以看作是一个容器,只能在容器的一端进行插入和删除操作。

插入操作称为“进栈”或“压栈”,删除操作称为“出栈”。

2. 栈的实现方式Java中可以使用数组或链表来实现栈。

使用数组实现时,需要定义一个固定大小的数组,并记录当前栈顶元素位置;使用链表实现时,则需要定义一个头节点和一个指向当前节点的指针。

3. 栈的应用场景Java栈在很多场景下都有着重要的应用,例如:- 方法调用:每当调用一个方法时,都会创建一个新的栈帧并压入当前线程对应的虚拟机栈中。

- 异常处理:当抛出异常时,JVM会创建一个异常对象,并将其压入当前线程对应的虚拟机栈中。

- 表达式求值:通过使用两个栈,一个存放操作数,一个存放运算符,可以实现表达式的求值。

二、常见操作1. 压栈(push)将一个元素压入栈顶。

Java代码示例:```public void push(E item) {ensureCapacity(size + 1);elements[size++] = item;}```2. 出栈(pop)弹出栈顶元素,并返回该元素。

Java代码示例:```public E pop() {if (size == 0)throw new EmptyStackException();E result = elements[--size];elements[size] = null; // 避免内存泄漏 return result;}```3. 查看栈顶元素(peek)返回当前栈顶元素,但不弹出该元素。

Java代码示例:```public E peek() {if (size == 0)throw new EmptyStackException(); return elements[size - 1];}```4. 判断是否为空(isEmpty)判断当前栈是否为空。

栈的操作(实验报告)

引言:栈是一种常见的数据结构,它具有特殊的操作规则,即先进后出(LIFO)。

本文将介绍栈的操作,并结合实验报告的方式详细阐述栈的概念、基本操作以及应用场景。

概述:栈是一种线性数据结构,由相同类型的元素按照特定顺序排列而成。

在栈中,只能在栈顶进行插入和删除操作,其他位置的元素无法直接访问。

栈具有两个基本操作:压栈(push)和弹栈(pop)。

其中,压栈将一个元素添加到栈顶,弹栈则是删除栈顶的元素。

除了基本操作外,栈还具有其他常见的操作,如获取栈顶元素(top)、判断栈是否为空(empty)等。

正文内容:一、栈的基本操作1.压栈(push)push操作的实现原理和步骤在实际应用中的使用场景和例子2.弹栈(pop)pop操作的实现原理和步骤在实际应用中的使用场景和例子3.获取栈顶元素(top)top操作的实现原理和步骤在实际应用中的使用场景和例子4.判断栈是否为空(empty)empty操作的实现原理和步骤在实际应用中的使用场景和例子5.栈的大小(size)size操作的实现原理和步骤在实际应用中的使用场景和例子二、栈的应用场景1.括号匹配使用栈实现括号匹配的原理和过程在编译器、计算表达式等领域中的应用2.浏览器的后退和前进功能使用栈来记录浏览器访问历史的原理和过程实现浏览器的后退和前进功能3.函数调用和递归使用栈来实现函数调用和递归的原理和过程在程序执行过程中的应用和注意事项4.实现浏览器缓存使用栈来实现浏览器缓存的原理和过程提高用户浏览速度的实际应用案例5.撤销操作使用栈来实现撤销操作的原理和过程在编辑器、图形处理软件等领域的实际应用总结:本文详细介绍了栈的操作,包括基本操作(压栈、弹栈、获取栈顶元素、判断栈是否为空、栈的大小)和应用场景(括号匹配、浏览器的后退和前进功能、函数调用和递归、实现浏览器缓存、撤销操作)。

通过了解栈的操作和应用,我们可以更好地理解数据结构中的栈,并能够在实际问题中灵活运用栈的特性。

入栈和出栈的基本操作

入栈和出栈的基本操作栈是一种常见的数据结构,它具有后进先出(LIFO)的特点,即最后进入的元素最先被取出。

在计算机科学中,栈被广泛应用于程序的运行、内存管理等方面。

本文将介绍栈的基本操作——入栈和出栈。

一、入栈入栈是指将一个元素放入栈中的操作。

在栈中,新元素总是被放在栈顶,而原有的元素则依次向下移动。

入栈操作可以用以下伪代码表示:```push(Stack, element)Stack[top] = elementtop = top + 1```其中,Stack表示栈,element表示要入栈的元素,top表示栈顶指针。

入栈操作的实现过程是将元素放入栈顶,然后将栈顶指针向上移动一位。

二、出栈出栈是指将栈顶元素取出的操作。

在栈中,只有栈顶元素可以被取出,而其他元素则不能被访问。

出栈操作可以用以下伪代码表示:```pop(Stack)top = top - 1element = Stack[top]return element```其中,Stack表示栈,top表示栈顶指针,element表示要取出的元素。

出栈操作的实现过程是将栈顶指针向下移动一位,然后将栈顶元素取出并返回。

三、应用栈的入栈和出栈操作在计算机科学中有着广泛的应用。

以下是一些常见的应用场景:1. 程序调用栈在程序运行时,每个函数都会被压入一个调用栈中。

当函数执行完毕后,它会从栈中弹出,控制权会返回到调用该函数的位置。

程序调用栈的实现依赖于栈的入栈和出栈操作。

2. 表达式求值在表达式求值中,栈可以用来存储操作数和运算符。

当遇到运算符时,可以将它入栈,当遇到操作数时,可以将它出栈并进行计算。

表达式求值的实现依赖于栈的入栈和出栈操作。

3. 内存管理在内存管理中,栈可以用来存储函数的局部变量和参数。

当函数被调用时,它的局部变量和参数会被压入栈中,当函数执行完毕后,它们会从栈中弹出。

内存管理的实现依赖于栈的入栈和出栈操作。

四、总结栈是一种常见的数据结构,它具有后进先出的特点。

顺序栈的基本操作及应用

顺序栈的基本操作及应用顺序栈是一种常见的数据结构,它是一种特殊的线性表,具有先进先出的特点。

顺序栈的基本操作包括压栈、弹栈、获取栈顶元素和判断栈是否为空。

它的应用非常广泛,常见的应用场景包括表达式求值、括号匹配、浏览器的前进后退功能等。

顺序栈的基本操作之一是压栈。

当需要将数据元素插入到栈中时,我们可以通过压栈操作将其放入栈顶。

具体而言,我们需要先判断栈是否已满,若已满则无法插入元素;若未满,则将元素放入栈顶,并更新栈顶指针的位置。

压栈操作的时间复杂度为O(1),即常数时间。

弹栈是顺序栈的另一个基本操作。

当需要从栈中删除元素时,我们可以通过弹栈操作将栈顶元素移除。

具体而言,我们需要先判断栈是否为空,若为空则无法删除元素;若不为空,则将栈顶元素移除,并更新栈顶指针的位置。

弹栈操作的时间复杂度也为O(1)。

获取栈顶元素是顺序栈的第三个基本操作。

当我们需要获取栈顶元素时,只需返回栈顶指针所指向的元素即可。

获取栈顶元素的时间复杂度为O(1)。

判断栈是否为空是顺序栈的最后一个基本操作。

当我们需要判断栈是否为空时,只需判断栈顶指针是否指向-1即可。

若栈顶指针为-1,则说明栈为空;否则,栈不为空。

顺序栈的应用非常广泛。

一种常见的应用是表达式求值。

在数学表达式的计算过程中,我们通常需要借助栈来实现运算符的优先级比较和计算。

具体而言,当遇到一个运算符时,我们可以将其压入栈中;当遇到一个数字时,我们可以将其转化为整数,并与栈顶的运算符进行运算。

通过不断地进行压栈、弹栈和计算操作,最终可以得到表达式的计算结果。

另一个常见的应用是括号匹配。

在编程中,括号的匹配是一项重要的检查工作。

我们可以借助栈来判断一个字符串中的括号是否匹配。

具体而言,当遇到一个左括号时,我们可以将其压入栈中;当遇到一个右括号时,我们可以弹出栈顶元素,并判断弹出的括号是否与当前的右括号匹配。

如果匹配,继续处理下一个字符;如果不匹配,说明括号不匹配,返回错误。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
InitNode(&p);
cout<<"请输入n,计算t(n):"<<endl;
cin>>n;
Push(&p,0);
length=Length(&p);
for(i=1; i<=n; i++)
{
e=2*getelem(&p,(length-(i/2)))+i;
Push(&p,e);
length=Length(&p);
{
int a=0;
Node *p1;
p1=p->top;
while(p1!=NULL)
{
p1=p1->next;
a++;
}
return a;
}
int getelem(Stack *p,int i)
{
Node *p1;
int k=1,a=0;
if(p->base==p->top)
return 0;
p1=p->top;
六、实验完成情况与总结
1、完成情况如下表(完成划勾、没完成打叉):
实验名称
实验完成情况
实验内容(1)
1
2
3
4
5
6
实验内容(2)
1
2
3
4
5
6
7
思考与提高(1)
思考与提高(2)
2、总结(自己对本部分知识的掌握情况以及存在的问题分析)
感觉自己对这些还是不够熟练,所以在打代码的时候还是要借助书籍,数据结构不得不说是一种对人的思维一种考验,希望自己能够认真的对待,一直想着成功出发。
e=p->top->data;
p1=p->top;
p->top=p->top->next;
free(p1);
return 1;
}
int getTop(Stack *p,int e)
{
if(p->base==p->top)
return 0;
e=p->top->data;
return e;
}
void print(Stack *p)
s.stacksize+=stackincrement;
}
*s.top++=e;
return ok;
}
status pop(sqstack &s,selemtype &e)
{
if(s.top==s.base)return error;
e=*--s.top;
return ok;
}
clearstack(sqstack &s)
{
if(s.top-s.base>=s.stacksize)
{
s.base=(selemtype *)realloc(s.base,(s.stacksize+stackincrement)*sizeof(selemtype));
if(!s.base)exit(overflow);
s.top=s.base+s.stacksize;
实验报告
课程名称数据结构实验名称栈的基本操作与应用
姓名王灵慧专业班级软工18104学号201817040409
试验日期2019-11-06试验地点E3-502指导老师邹汉斌成绩
一、实验目的
1.熟悉并能实现栈的定义和基本操作。
2.了解和掌握栈在递归和非递归算法的应用。
二、实验要求
1.进行栈的基本操作时要注意栈“后进先出”的特性。
}
b=getTop(&p,b);
cout<<"用链栈得到的结果如下:"<<endl;
cout<<"t("<<n<<")"<<"="<<b<<endl;
cout<<"用顺序栈得到的结果如下:"<<endl;
cout<<"t("<<n<<")"<<"="<<b<<endl;
cout<<"用递归方法得到的结果如下:"<<endl;
#define stackincrement 10
using namespace std;
typedef int selemtype;
typedef int status;
typedef struct
{
selemtype *base;
selemtype *top;
int stacksize;
} sqstack;
{
p1->data=e;
p->top=p1;
p1->next=NULL;
}
else
{
p1->data=e;
p1->next=p->top;
p->top=p1;
}
return 1;
}
int Pop(Stack *p,int e)
{
Node *p1;
if(p->base==p->top)
return 0;
status initstack(sqstack &s)
{
s.base=(selemtype *)malloc(stack_init_size * sizeof(selemtype));
if(!s.base)exit(overflow);
s.top=s.base;
s.stacksize=stack_init_size;
{
s.top=s.base;
cout<<endl<<"栈已经为您清空"<<endl;
}
destroystack(sqstack &s)
{
int i,len;
len=s.stacksize;
for (i=0; i<len; i++)
{
free(s.base);
s.base++;
}
cout<<"栈已经为您销毁"<<endl;
{
Node *p1;
cout<<"栈内元素如下:"<<endl;
if(p->base==p->top)
{
cout<<"栈为空!!"<<endl;
exit(0);
}
p1=p->top;
while(p1!=NULL)
{
cout<<p1->data;
p1=p1->next;
}
cout<<endl;
}
int Length(Stack *p)
w=add(n);
cout<<"t("<<n<<")"<<"="<<w<<endl;
return 0;
}
3、思考与提高
1.如果一个程序中要用到两个栈,为了不发生上溢错误,就必须给每个栈预先分配一个足够大的存储空间。若每个栈都预分配过大的存储空间,势必会造成系统空间紧张。如何解决这个问题?
让多个栈共用一个足够大的连续存储空间,利用栈的动态特性使它们的存储空间互补。
while((p1!=NULL)&&(k<i))
{
p1=p1->next;
k++;
}
return p1->data;
}
int add(int x)
{
int a;
if(x==0)
a=0;
else
a=(2*add(x/2)+x);
return a;
}
int main()
{
Stack p;
int i,b=0,e=0,n,w=0,length=0;
(2)分别用链式栈和顺序栈实现计算t(n)的非递归算法。
四、思考与提高
1.如果一个程序中要用到两个栈,为了不发生上溢错误,就必须给每个栈预先分配一个足够大的存储空间。若每个栈都预分配过大的存储空间,势必会造成系统空间紧张。如何解决这个问题?
五、实验步骤(每个实验内容包含代码、输入、输出、错误分析):
if(!p->base)
return 0;
p->top=p->base;
p->top->data=0;
p->top->next=NULL;
return 1;
}
int Push(Stack *p,int e)
{
Node *p1;
p1=(Node*)malloc(sizeof(Node));
if(p->base==p->top)
typedef struct node
{
int data;
struct node *next;
} Node;
typedef struct
{
Node *top;
Node *base;
} Stack;
int InitNode(Stack *p)
相关文档
最新文档