已知栈的4个运算定义如下:
Push(S,x) //元素x入栈
Pop(S,x) //S出栈并将出栈的元素赋值给x
StackEmpty(S) //判断S是否为空
StackOverflow(S) //S是否满
用以上的运算实现以下3个运算:进队列,出队列,判空。
算法思想:利用两个栈s1和s2来模拟队列,当需要向队列中插入元素时,用s1来存放已输入的元素,即s1执行入栈。
当需要出栈时,则对s2执行出栈操作。由于从栈中取元素的顺序是原顺序的逆序,所以,要先将s1里元素 全部出栈并压入s2中,再从s2中取元素,实现出队列操作。而在执行此操作前,必须先判断s2是否为 空,否则会使顺序混乱。当s1和s2都为空时,队列为空。
入队列算法:
int EnQueue(Stack s1,Stack s2,ElemType e){
if(!StackOverflow(s1)){ //若s1未满。则直接入栈
Push(s1,e);
return 1;
}
if(StackOverflow(s1)&&StackOverflow(s2)){ //若s1和s2都满,则说明队列满
printf("队列满");
return 0;
}
if(StackOverflow(s1)&&!StackOverflow(s2)){ // 若s1满而s2未满,则先将s1中的元素压入s2,再将x入s1
while(!StackOverflow(s1)){
Pop(s1,x);
Push(s1,x);
}
Push(s1,e);
return 1;
}
}
出队列算法:
void DeQueue(Stack s1,Stack s2,ElemType x){ //若s2不为空,则直接取出元素
if(!StackOverflow(s2)){
Pop(s2,x);
}
else if(StackOverflow(s1)){ //r若s2和s1都空,则队列为空
printf("队列空");
}
else{
while(!StackOverflow(s1)){ //若s2空,而s1不为空,则先将s1的元素全部压入s2,在从s2取元素。
Pop(s1,x);
Push(s2,x);
}
Pop(s2,x);
}
}
判空算法:
int QueueEmpty(Stack s1,Stack s2){
if(StackOverflow(s1)&&StackOverflow(s2))
return 1;
else return 0;
}