有关栈和队列的两道题
一、两个栈共享向量空间v[m],它们的栈底分别设在向量空间的两端,每个元素占一个分量。试写出两个栈公用的栈操作算法:Push(i,x)和出栈Pop(i),top(i)其中i为0或1,用以指示栈号。
以下是基本算法:
#define m 64
typedef int datatype;
typedef struet
{ datatype v[m];
int top1,top2;
}seqstack;
push (s, i, x) //入栈操作
seqstack *s;
int i;
datatype x;
{
if (i!=0‖i!=1)
printf(”error!”);
else
if (i==1) //如果是一号栈的入栈操作
{if (s->top1==s->top2)
printf(“overflow!”);
else
{
s->top1++;
s->v[s->top1]=x;
}
}
else //如果是二号栈的入栈操作
{if (s->top2==s->top1)
printf (“overflow!”);
else
{
s->top2--
s->v[s->top2]=x;
}
}
}
datatype pop(s,i) //出栈操作
seqstack *s;
int i;
{
if (i!=0‖i!=1)
printf(“error!”);
else
if (i==1) //如果是一号栈的出栈操作
{if (s->top1== -1)
printf(“underflow!”);
else
{
s->top1--;
return(s->v[s->top1+1]);
}
}
else //如果是二号栈的出栈操作
{if (s->top2==m)
printf(“underflow!”);
else
{
s->top2++;
return (s->v[s->top2-1]);
}
}
}
datatype top(s,i)
seqstack *s;
int i;
{
if (i!=0‖i!=1)
printf(“error!”);
else
if (i==1) //如果是一号栈的取栈顶操作
if(s->top1=-1) printf(“stack is empty”);
else
return(s->data[s->top1]);
else //如果是二号栈的取栈顶操作
if(s->top2=m) printf(“stack is empty”);
else
return(s->data[s->top2]);
}
二、假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素站点(注意不设头指针),试编写相应的置空队、入队列和出队列的算法。
解:
置空队
setNULL(rear)
linklist *rear;
{ rear=(linklist*)malloc(sizeof(linklist));
rear->next=rear;
}
入队列
inQUEUE(rear,x)
linklist *rear
datatype x;
{ linklist *p;
p=(linklist*)malloc(sizeof(linklist));
p->next=rear->next;
rear->next=p;
p->data=x;
rear=p;
}
出队列
datatype outQUEUE(rear)
Linklist *rear;
{ linklist *p,*q;
if (rear->next==rear)
printf(“EMPTY!”);
else
{
q=rear->next;
p=q->next;
}
if (p==rear)
rear=q; //说明原队列只有两个结点
q->next=p->next;
x=p->data;
free(p);
return(x);
}
发表于 @ 2007年04月26日 13:21:00|评论(loading...)|编辑