zoukankan      html  css  js  c++  java
  • 栈的操作

    问题描述:

     假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存着两个栈,它们的栈底分别设在数组的两个端点,试编写实现这个双向栈tws的三个操作,初始化initstack(tws),入栈push(tws,i,x)和出栈pop(tws,i)的算法,其中i01,用以分别指示设在数组两端的两个栈。

    问题分析:

    这道题主要是要求我掌握栈的初始化,入栈和出栈的算法。要注意的是,这两个栈在一维数组中。是不是思维有点懒呢?又想着看了,真不好。

     首先看下链栈的数据结构及方法的定义

    Typedef  struct NodeType{

    ElemType  data;

    NodeType  *next;

    }NodeType, *LinkType;

    Typedef  struct{

    LinkType  top;

    Int  size;

    }Stack;

     

    Void InitStack(Stack  &s)

    {

      S.top=null;

      S.size=0;

    }

    Void DestoryStack(Stack  &s)

    {

      LinkType p;

      While(s.top){

      P=s.top;

      S.top=p->next;//没看到这句代码之前可能还不知道栈是怎样得到下一个元素,现在明白了,它利用 p也就是栈的元素类型是由结构体定义的,里面有个next成员,指向下一个结点。 

      Word排版问题,说实话,我哪天真要花点功夫把它弄个明白。等着瞧。。。

      Delete p;

      S.size--;

     }

    }

    Int StackLength(Stack s)

    {

       Return s.size;

    }

    Status StackEmpty(Stack s)

    {

      If(s.size==0) return true;

      Else return false;

    }

    Status GetTop(Stack s,ElemType &e)

    {

     If(!s.top) return error;

     Else{

         e =s.top->data;

         Return ok;

         }

    }

    Status push(Stack  &s,   ElemType  e)

    {

       LinkType p;

       P=new NodeType;//明白这一语句的意思了,实例化一个next结点。因为这是要入栈,所以在栈顶会加一个结点进来,所以也就要实例化一个next结点了。

       If(!p)

       Exit(OVERFLOW);

       P->next=s.top;//这两句,可以看出栈的存储顺序了。

       S.top=p;

       P->data=e;

       S.size++;

       Return ok;

    }

     

    Status Pop(Stack  &s,  ElemType  &e)//e的值加了个地址符,代表引用,有必要吗?

    {

    LinkType  p;

    If(s.top){

       e =s.top->data;

       P=s.top;

       S.top=p->next;

       Delete p;

       S.size--;

    }

    Return ok;

    }

    Void StackTraverse( Stack  s,  Status (*Visit)(ElemType  e))

    {

       LinkType  p;

       P=s.top;

       While(p) Visit(p->data);

    }

      然后再分析这两个栈在一个一维数组中,要从中间开始分析,这个我还真没想到,刚开始对书上的算法也不是很懂,但后来懂了

    Class  DStack{

    ElemType  *top[2];//理解指针数组,数组中的元素也是一个指针,在这道题中表示的是其地址

    ElemType   *p;

    Int stacksize;

    Int di;

    DStack(int m)

    {

      P=new ElemType[m];//p指向的是起始位置

      If(!p) exit(OVERFLOW);

      Top[0]=p+m/2;//这意味着指向它的中点

      Top[1]=top[0];

    Stacksize=m;

    }

    ~DStack(){delete p;}

    Void push(int i, ElemType  x)

    {

     Di=i;

    If(di==0)

    {

      If(top[0]>=p) *top[0]--=x;//向上

      Else printf(栈溢出!);

    }

    Else{

    If(top[1]<p+stacksize-1)

    *++top[1]=x;

    Else 

    Printf(栈溢出!);

      }

    }

     

    ElemType Pop(int i)

    {

      Di=i;

      If(di==0)

      {

       If(top[0]<top[1])//比较地址

       Return *++top[0];//这是代表先取top[0]的值然后 再将地址变化(及将此值的地址向下移,也就是变大),还是先把top[0]指针的地址向下移,也就是变大,然后再取值。如果按效果来说,应该是第一种情况。取值的运算符的级别应该是大于++运算符的级别的。

       Else

        Printf(栈为空!);

      }

     Else{

      If(top[1]>top[0])

      Return *top[1]--;

      Else

       Printf(栈为空);

     }

    Return ok;

    }//pop

    }

  • 相关阅读:
    SSH 错误解决案例1:Read from socket failed: Connection reset by peer
    vmware已经全面支持open-vm-tools
    RHEL7.1 安装openstack juno 一个BUG
    web快速开发框架 WebBuilder 8.7发布
    2019年如何选择合适的快速开发平台和框架
    快速开发平台 WebBuilder 8.6发布
    快速开发平台比较
    快速开发平台 WebBuilder 8.4 发布
    快速开发平台 WebBuilder 8 发布
    快速开发平台WebBuilder中ExtJS表格的增删改查
  • 原文地址:https://www.cnblogs.com/wj204/p/3044323.html
Copyright © 2011-2022 走看看