栈的操作
问题描述:
假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存着两个栈,它们的栈底分别设在数组的两个端点,试编写实现这个双向栈tws的三个操作,初始化initstack(tws),入栈push(tws,i,x)和出栈pop(tws,i)的算法,其中i为0或1,用以分别指示设在数组两端的两个栈。
问题分析:
这道题主要是要求我掌握栈的初始化,入栈和出栈的算法。要注意的是,这两个栈在一维数组中。是不是思维有点懒呢?又想着看了,真不好。
首先看下链栈的数据结构及方法的定义
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
}