zoukankan      html  css  js  c++  java
  • 堆栈的公式化描述实现

    堆栈和队列可能是使用频率最高的数据结构,二者都来自于线性表数据结构(经过某种限制以后)。堆栈数据结构是通过对线性表的插入和删除操作进行限制而得到的(插入和删除操作都必须在表的同一端完成),因此,堆栈是一个后进先出( last-in-first-out, LIFO)的数据结构。
    1、定义
    定义 [堆栈] 堆栈( s t a c k)是一个线性表,其插入(也称为添加)和删除操作都在表的同一端进行。其中一端被称为栈顶( t o p),另一端被称为栈底( b o t t o m)。

    ADT:

    2、公式化描述

    堆栈是一种特殊的线性表,因此它可以使用数组或链表实现。使用数组实现即使公式化描述实现。

    令栈顶元素存储在 e l e m e n t [ l e n g t h - 1 ]中,栈底元素存储在 e l e m e n t [ 0 ]中。堆栈元素存储在数组s t a c k之中, t o p用于指向栈顶元素。堆栈的容量为 M a x To p + 1 。

    3、代码实现

    模板类:

    (exceotionerror.h见队列的实现:公式化描述)

      1 #ifndef ARRAYSTACK_H
      2 #define ARRAYSTACK_H
      3 #include "exceptionerror.h"
      4 
      5 template<class T>
      6 class ArrayStack
      7 {
      8 public:
      9     ArrayStack(const int& MaxStackSize = 10);
     10     ArrayStack(T* s, const int& n,const int& MaxStackSize=10);
     11     ~ArrayStack()
     12     {
     13         if (stack!=NULL)
     14         {
     15             delete[] stack;
     16         }
     17     }
     18     friend std::ostream& operator<<(std::ostream& output,const ArrayStack<T>& s)
     19     {
     20         if (s.IsEmpty())
     21         {
     22             output << "Stack is empty" << std::endl;
     23         }
     24         else
     25         {
     26             for (int i = 0; i <= s.top;++i)
     27             {
     28                 output << s.stack[i] << " ";
     29             }
     30         }
     31 
     32         return output;
     33     }
     34     bool IsEmpty()const{ return top == -1; }
     35     bool IsFull()const{ return top == MaxTop; }
     36     T Top()const;
     37     ArrayStack<T>& Add(const T& x);
     38     ArrayStack<T>& Delete(T& x);
     39     int Quantity()const
     40     {
     41         return top + 1;
     42     }
     43 private:
     44     int top;
     45     int MaxTop;
     46     T* stack;
     47 };
     48 
     49 template<class T>
     50 ArrayStack<T>::ArrayStack(const int& MaxStackSize=10):MaxTop(MaxStackSize-1),top(-1)
     51 {
     52     stack = new T[MaxStackSize];
     53 }
     54 
     55 template<class T>
     56 ArrayStack<T>::ArrayStack(T* s, const int& n,const int& MaxStackSize):MaxTop(MaxStackSize-1),top(n-1)
     57 {
     58     if (top>MaxTop)
     59     {
     60         throw OutofBounds();
     61     }
     62     else
     63     {
     64         stack = new T[MaxStackSize];
     65         memcpy(stack, s, n*sizeof(T));
     66     }
     67 }
     68 
     69 template<class T>
     70 T ArrayStack<T>::Top()const
     71 {
     72     if (IsEmpty())
     73     {
     74         throw OutofBounds();
     75     }
     76     else
     77         return stack[top];
     78     
     79 }
     80 
     81 template<class T>
     82 ArrayStack<T>& ArrayStack<T>::Add(const T& x)
     83 {
     84     if (IsFull())
     85     {
     86         throw NoMem();
     87     }
     88     else
     89     {
     90         stack[++top] = x;
     91         return *this;
     92     }
     93 }
     94 
     95 template<class T>
     96 ArrayStack<T>& ArrayStack<T>::Delete(T& x)
     97 {
     98     if (IsEmpty())
     99     {
    100         throw OutofBounds();
    101     }
    102     else
    103     {
    104         x=stack[top--];
    105         return *this;
    106     }
    107 }
    108 #endif

    测试代码:

     1 #include "ArrayStack.h"
     2 
     3 int main()
     4 {
     5     ArrayStack<int> S;
     6     std::cout << "S is empty? " << S.IsEmpty() << std::endl;
     7     S.Add(1);
     8     S.Add(2);
     9     S.Add(3);
    10     S.Add(4);
    11     S.Add(5);
    12     S.Add(6);
    13     std::cout << "S is :" << std::endl;
    14     std::cout << S;
    15     std::cout << std::endl;
    16     std::cout << "Quantity of S is " << S.Quantity() << std::endl;
    17     int x;
    18     S.Delete(x);
    19     std::cout << "Num Deleted is " << x << std::endl;
    20     std::cout << "S is :" << std::endl;
    21     std::cout << S;
    22     std::cout << std::endl;
    23     std::cout << "Quantity of S is " << S.Quantity() << std::endl;
    24 
    25     int a[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
    26     ArrayStack<int> S2(a, 8);
    27     std::cout << "S2 is :" << std::endl;
    28     std::cout << S2;
    29     std::cout << std::endl;
    30     std::cout << "Quantity of S2 is " << S2.Quantity() << std::endl;
    31     system("pause");
    32     return 0;
    33 
    34 }

    输出:

  • 相关阅读:
    docker容器之启动容器
    docker镜像之registry
    docker镜像之镜像命名
    习题3
    习题二(1)
    课堂作业4
    课堂作业(电费)
    课堂作业2
    实验4
    实验3
  • 原文地址:https://www.cnblogs.com/haoliuhust/p/4256743.html
Copyright © 2011-2022 走看看