zoukankan      html  css  js  c++  java
  • 数据结构第七篇——顺序栈

    ♥注:未经博主同意,不得转载。

      栈(stack)是常用的重要数据结构,其应用十分广泛。栈是一个操作受限的线性表,其插入和删除操作都在表的同一端进行。

      其中允许操作的一端称为栈顶(top),另一端称为栈底(bottom),不含元素的栈称为空栈

      栈的修改是按后进先出的原则进行的,因此,栈称为后进先出表(Last In First Out,LIFO)。称插入元素的操作为入栈(push),删除元素的操作为出栈(pop)。

      栈由元素列表、指向栈顶的下标或指针以及栈的操作集组成。栈的具体实现有两种方式:顺序栈和链栈。

    顺序栈

      顺序栈的说明包括表StackList和栈顶下标(top)。初始时栈为空,此时top=-1,每当一个元素进栈(push)时,top的值增一,每当一个元素出栈(pop)时,top的值减一。

      使用数组存放数据元素时,需要定义函数IsFull()判断栈满的情况。

    顺序栈的定义如下:

     1 const int MaxStackSize=50;
     2 typedef int DataType;
     3 class Stack
     4 {
     5     private:
     6         DataType StackList[MaxStackSize];
     7         int top;
     8     public:
     9         Stack(){top=-1;}
    10         ~Stack(){};
    11         
    12         void Push(DataType item);    //进栈
    13         DataType Pop();                //出栈
    14         DataType GetTop();            //取栈顶操作
    15         void Clear();                    //置空栈
    16         bool IsEmpty();                //判栈空否 
    17         bool IsFull();                 //判栈满否 
    18         void Print();                    //打印数据 
    19 };

    下面给出部分操作的算法描述:

     1 //判断栈是否为空 
     2 bool Stack::IsEmpty()
     3 {
     4     if(top==-1)
     5     return true;     
     6     else 
     7     return false;       
     8 }
     9 //判断栈是否已满
    10 bool Stack::IsFull()
    11 {
    12     if(top==MaxStackSize-1)
    13     return true;
    14     else
    15     return false;
    16 } 
    17 //取栈顶元素
    18 DataType Stack::GetTop()
    19 {
    20     if(IsEmpty())
    21     {
    22         cout<<"栈空!"<<endl;
    23         exit(0); 
    24     }
    25     return StackList[top];
    26 } 
    27 //进栈
    28 void Stack::Push(DataType x)
    29 {
    30     if(IsFull())
    31     {
    32         cout<<"栈满"<<endl;
    33         exit(0);
    34     }
    35     else
    36     StackList[++top]=x;
    37 } 
    38 //出栈
    39 DataType Stack::Pop()
    40 {
    41     if(IsEmpty())
    42     {
    43         cout<<"栈空"<<endl;
    44         exit(0);
    45     }
    46     return StackList[top--];
    47 } 
    48 //清空栈
    49 void Stack::Clear()
    50 {
    51     top=-1;
    52 } 
    53 //打印数据
    54 void Stack::Print()
    55 {
    56     for(int i=top;i>-1;--i)
    57     cout<<StackList[i]<<"  ";
    58     cout<<endl; 
    59 } 

    测试部分则放在main函数:

     1 int main()
     2 {
     3     Stack stack;
     4     DataType a[10]={2,5,8,6,9,85,6,9,9,7};
     5     DataType e;
     6     if(stack.IsEmpty())
     7     cout<<"此栈为空"<<endl;
     8     else
     9     cout<<"此栈不空"<<endl;
    10     
    11     if(stack.IsFull())
    12     cout<<"此栈已满"<<endl;
    13     else
    14     cout<<"此栈不满"<<endl;
    15     
    16     for(int i=0;i<8;++i) 
    17         stack.Push(a[i]);
    18         
    19     stack.Print();
    20     
    21     cout<<stack.GetTop()<<endl;
    22     
    23     cout<<"进栈:";
    24     cin>>e;
    25     stack.Push(e);
    26     stack.Print();
    27     cout<<stack.GetTop()<<endl;
    28     
    29     cout<<"出栈:";
    30     stack.Pop();
    31     stack.Print();
    32     cout<<stack.GetTop()<<endl;
    33     
    34     if(stack.IsEmpty())
    35     cout<<"此栈为空"<<endl;
    36     else
    37     cout<<"此栈不空"<<endl;
    38     
    39     if(stack.IsFull())
    40     cout<<"此栈已满"<<endl;
    41     else
    42     cout<<"此栈不满"<<endl;
    43     
    44     cout<<"出栈:";
    45     stack.Pop();
    46     stack.Print();
    47     
    48     cout<<"清空栈:"<<endl;
    49     stack.Clear();
    50     
    51     if(stack.IsEmpty())
    52     cout<<"此栈为空"<<endl;
    53     else
    54     cout<<"此栈不空"<<endl;
    55      
    56     return 0;
    57 }

    简单的测试结果如下:

    定义顺序栈时,应该知道所需的最大栈长度。如果事先无法预知栈的最大长度,可以采用链栈。

    链栈的建立请转至http://www.cnblogs.com/tenjl-exv/p/7580418.html

    v、

  • 相关阅读:
    MYSQL长连接的一个小问题
    wpf关于PasswordBox的绑定Password的问题(MVVM框架)
    关于C# DataGridView 全选与取消的小问题
    谈谈在京东手机APP的产品推荐
    赵海平给中国开发者的建议
    python_闭包_匿名函数
    mysql远程连接10038错误
    计算机系统 -- 计算机
    Java——类和对象
    ORACLE数据库定时任务—DBMS_JOB
  • 原文地址:https://www.cnblogs.com/tenjl-exv/p/7575549.html
Copyright © 2011-2022 走看看