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 }

    输出:

  • 相关阅读:
    Oracle SQL语句收集
    SqlParameter In 查询
    SQL 性能优化
    Entity Framework
    【XLL API 函数】 xlfSetName
    【XLL API 函数】xlfUnregister (Form 2)
    【XLL API 函数】xlfUnregister (Form 1)
    【Excel 4.0 函数】REGISTER 的两种形式以及VBA等效语句
    【Excel 4.0 函数】REGISTER
    【Bochs 官方手册翻译】 第一章 Bochs介绍
  • 原文地址:https://www.cnblogs.com/haoliuhust/p/4256743.html
Copyright © 2011-2022 走看看