数据结构——栈(面试题)

本文介绍了栈数据结构,特别是栈的定义、基本操作及顺序和链式存储结构。通过C++和C语言展示了栈的实现,并举例说明了栈在数制转换、语法词法分析和汉诺塔问题中的应用。
摘要由CSDN通过智能技术生成

在一个栈的输入序列为12345 下面哪个不可能是栈的输出序列?

A. 23415  B.54132  C.23145  D.15432

第二个。54132不可能。
23415------>1进栈,2进栈,2出栈,3进栈,3出栈,4进栈,4出栈,1出栈,5进栈,5出栈
23145------>1进栈,2进栈,2出栈,3进栈,3出栈,1出栈,4进栈,4出栈,5进栈,5出栈
15432------>1进栈,1出栈,2进栈,2进栈,4进栈,5进栈,5出栈,4出栈,3出栈,2出栈

1.栈

1.1 栈的定义

栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。如下所示:


结论:后进先出(Last In First Out),简称为LIFO线性表。

栈的基本运算有六种:

构造空栈:InitStack(S)、

判栈空: StackEmpty(S)、

判栈满: StackFull(S)、

进栈: Push(S,x)、可形象地理解为压入,这时栈中会多一个元素

退栈: Pop(S) 、 可形象地理解为弹出,弹出后栈中就无此元素了。

取栈顶元素:StackTop(S),不同与弹出,只是使用栈顶元素的值,该元素仍在栈顶不会改变。

    由于栈也是线性表,因此线性表的存储结构对栈也适用,通常栈有顺序栈链栈两种存储结构,这两种存储结构的不同,则使得实现栈的基本运算的算法也有所不同。

我们要了解的是,在顺序栈中有"上溢"和"下溢"的概念。顺序栈好比一个盒子,我们在里头放了一叠书,当我们要用书的话只能从第一本开始拿(你会把盒子翻过来吗?真聪明^^),那么当我们把书本放到这个栈中超过盒子的顶部时就放不下了(叠上去的不算,哼哼),这时就是"上溢","上溢"也就是栈顶指针指出栈的外面,显然是出错了。反之,当栈中已没有书时,我们再去拿,看看没书,把盒子拎起来看看盒底,还是没有,这就是"下溢"。"下溢"本身可以表示栈为空栈,因此可以用它来作为控制转移的条件。

链栈则没有上溢的限制,它就象是一条一头固定的链子,可以在活动的一头自由地增加链环(结点)而不会溢出,链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,等于要在头结点之后的结点进行操作,反而使算法更复杂,所以只要有链表的头指针就可以了。


1.2 栈的顺序存储

使用c++的面向对象封装:

  1. // Test.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include <iostream>
  5. using namespace std;
  6. #define MAX 10 // MAXIMUM STACK CONTENT
  7. class stack
  8. {
  9. private:
  10. int arr[MAX];
  11. int top;
  12. public:
  13. stack()
  14. {
  15. inItStack();
  16. }
  17. /************************************************************************/
  18. /* 初始化栈 */
  19. /************************************************************************/
  20. void inItStack()
  21. {
  22. top= -1;
  23. }
  24. /************************************************************************/
  25. /* 入栈 */
  26. /************************************************************************/
  27. void push(int a)
  28. {
  29. top++;
  30. if(top < MAX) {
  31. arr[top]=a;
  32. } else {
  33. cout<< "STACK FULL!!"<<top;
  34. }
  35. }
  36. /************************************************************************/
  37. /* 出栈 */
  38. /************************************************************************/
  39. int pop()
  40. {
  41. if(isEmpty()) {
  42. cout<< "STACK IS EMPTY ";
  43. return NULL;
  44. } else {
  45. int data=arr[top];
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值