数据结构重要算法.docVIP

  • 10
  • 0
  • 约4.67万字
  • 约 53页
  • 2019-09-08 发布于江西
  • 举报
版权:wuliming_sc 修改:Air_sky 说明:本资料是Air_sky修改wuliming_sc整理的数据结构材料.仅供各位考研师弟师妹们方便之用,如有什么疑议,请通知Air_sky(iceman0481@163.com)本人即删除!!! 1、栈的基本操作:编写一个算法,利用栈的基本运算将指定栈中的内容进行逆转。 void reverse( Stack *s ) { Stack s1, s2; ElemType x; InitStack( s1 ); InitStack( s1 ); //将s栈中的内容转移到s1栈中 while( StackEmpty( s ) != 0 ) { Pop( s, x ); Push( s1, x ); } //将s1栈中的内容转移到s2栈中 while( StackEmpty( s1 ) != 0 ) { Pop( s1, x ); Push( s2, x ); } //将s2栈中的内容转移到s栈中 while( StackEmpty( s2 ) != 0 ) { Pop( s2, x ); Push( s, x ); } } 解题思路:假定栈采用顺序结构。利用两个临时的栈s1,s2。先将s栈中的内容转移到s1栈中;再将s1栈中内容转移到s2栈中;最后将s2栈中的内容转移到s栈中,这样s栈中的内容就被逆转了。 2、利用两个栈s1、s2模拟一个队列是,如何用栈的运算来实现该队列的运算: EnQueue:插入一个元素; DeQueue:删除一个元素; QueueEmpty:判断队列为空; 解题思路:由于栈的特点是先进后出,为了模拟先进先出的队列,必须有两个栈,一个栈s1用于插入元素,另一个栈s2用于删除元素,每次删除元素时应将前一个栈的所有元素出栈并压栈到第二个栈中,这样才能达到模拟队列的效果。 int EnQueue( Stack *s1, Stack *s2, ElemType x ) { if( s1-top == MaxSize ) //队列上溢 return -1; else { Push( s1, x ); return 0; } } int DeQueue( Stack *s1, Stack *s2, ElemType *x ) { ElemType y; while( StackEmpty(s1) != 0 ) //将s1的所有元素退栈进入s2中 { Pop( s1, y ); Push( s2, y ); } Pop( s2, x ); //将s2的栈顶元素退栈并赋给x while( StackEmpty(s2) != 0 ) //将s2余下的元素退栈后进入s1中 { Pop( s2, y ); Push( s1, y ); } } 3、共享存储空间的栈:有两个栈s1和s2共享存储空间c[1…m],其中的一个栈s1的栈底设在c[1]处,另一个栈s2的栈底设在c[m]处。分别编写s1和s2的进栈push(i, x)、退栈pop(i)和设置栈空setnull(i)的函数,其中i=1、2,分别表示对栈1或者栈2进行设置(注意:仅当整个空间c[1…m]占满时才产生溢出)。 top1 = 1; top2 = m; ... int push( ElemType x, int i ) {//上溢出 if( top1 == top2 - 1 ) { return -1; } //对第一个栈进行进栈操作 else if( i == 1 ) { top1++; c[top1] = x; } //对第二个栈进行进栈操作 else { top2--; c[top2] = x; } return 0; } int pop( ElemType *x, int i ) { //对第一个栈进行出栈操作 if( i == 1 ) { if( top1 == 0 )//栈1下溢出 { return -1; } else { x = c[top1]; top1--; } } //对第二个栈进行出栈操作 els

文档评论(0)

1亿VIP精品文档

相关文档