栈的操作

问题描述:

 假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存着两个栈,它们的栈底分别设在数组的两个端点,试编写实现这个双向栈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

}

原文地址:https://www.cnblogs.com/wj204/p/3044323.html