1、若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进行,则可能出现的出栈序列为( B),并写出入栈顺序。
A.3,2,6,1,4,5 B.3,4,2,1,6,5
C.1,2,5,3,4,6 D.5,6,4,2,3,1
2、已知顺序栈定义如下,请将元素d入栈的代码补充完整
定义栈的数据类型*/
typedef struct{
int *base;//栈底指针
int *top;//栈顶指针
int stack_size;//栈的大小
}SqStack;
/*功能:将元素d入栈返回值:1:成功 0:失败*/
int push( SqStack *S ,int d)
{ //判断栈是否已满,如果满,入栈失败
if( S->top-S->base >=s->stack_size)
{ printf("栈已满,入栈失败!\n");
return 0;
}
//把d放入top指针所指的位置
*( S->top )=d;
//top指针上移(++)
S->top++ ;
return 1 ;
}
3、循环队列的优点是什么? 请列出并说明哪些方法可以判别它的空和满?
循环队列的优点时可以有效的利用存储空间,避免出现假溢出的现象。
当头尾指针相等时,即rear==front的时候循环队列为空
当队尾指针增1后取模运算的值与对头指针相等时,即(rear+1)%maxsize==front时循环队列满
4、设长度为n的链队用单循环链表表示,若设头指针,则入队出队操作的时间为何? 若只设尾指针呢?
当设头指针时,出队操作为1,入队操作为n
当设尾指针时,出队操作为1,入队操作为1
5、
已知顺序队列定义如下,请将下列代码补充完整:
typedef struct{
int queue[MAX_QUEUE_SIZE];
int front;//队头
int rear;//队尾
}SqQueue;
/*功能:出队(把队首元素删除)参数:sq指向一个顺序队列,d:保存删除元素 返回值:1:成功 0:失败*/
int DeQueue(SqQueue *sq,int *d)
{//如果sq为NULL,输出 “队列未创建,出队失败”,返回0
if( Sq==NULL )
{
printf(“队列未创建,出队失败!\n”) ;
return 0 ;
}
//如果队列为空:输出:队列为空,出队失败!,返回0
If(sq->front == sq->rear)
{
printf(“队列为空,出队失败!\n”) ;
return 0 ;
}
*d= sq->queue[sq->front] ;//否则,把front所指的元素存入d
sq->front= (sq->front+1)%MAX_QUEUE_SIZE ; //front+1
return 1;
}