考研 ing
努力努力再努力
**
第三章 栈与队列
1.循环队列带标志位
入队
int EnQueue(SqQueue &Q,ElemType x){
if(Q.rear==Q.front&&Q.tag==1)
return 0;
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%MaxSize;
Q.tag=1;
return 1;
}
出队
int DeQueue(SqQueue &Q,ElemType &x){
if(Q.front==Q.rear&&Q.tag==0)
return 0;
x=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize;
Q.tag=0;
return 1;
}
2.用栈实现队列元素逆置
void Inverser(Stack &S,Queue &Q){
while(!QueueEmpty(Q)){
x=DeQueue(Q);
Push(S,x);
}
while(!StackEmpty(S)){
Pop(S,x);
EnQueue(Q,x);
}
}
3.两个栈实现队列运算
思想:
1.入队为栈1入队,出队为栈1先进入栈2,再由栈2出栈。
2.入队时若栈1满,栈2空先将栈1移入栈2;若栈2已有元素则失败。
3.队列空指的是两个栈均空。
入队
int EnQueue(Stack &S1,Stack &S2,ElemType e){
if(!StackOverflow(S1)){
Push(S1,e);
return 1;
}
if(StackOverflow(S1)&&!StackEmpty(S2)){
printf("队列满");
return 0;
}
if(StackOverflow(S1)&&StackEmpty(S2)){
while(!StackEmpty(S1)){
Pop(S1,x);
Push(S2,x);
}
}
Push(S1,e);
return 1;
}
出队
void DeQueue(Stack &S1,Stack &S2,ElemType &x){
if(!StackEmpty(S2)){
Pop(S2,x);
}
else if(StackEmpty(S1))
printf("队列为空");
else{
while(!StackEmpty(S1)){
Pop(S1,e);
Push(S2,e);
}
Pop(S2,x);
}
}
判空
int QueueEmpty(Stack &S1,Stack &S2){
if(StackEmpty(S1)&&StackEmpty(S2))
return 1;
else
return 0;
}
4.括号匹配问题
bool BracketsCheck(char *str){
InitStack(S);
int i=0;
while(str[i]!='\0'){
switch(str[i]){
case'(': Push(S,'(');break;
case'[': Push(S,'[');break;
case'{': Push(S,'{');break;
case')': Pop(S,e);
if(e!='(') return false;
break;
case']': Pop(S,e);
if(e!='[') return false;
break;
case'}': Pop(S,e);
if(e!='{') return false;
break;
default: break;
}
i++;
}
if(!IsEmpty(S))
return false;
else
return true;
}
5.火车硬座软座调换
void Train_Arrange(char *train){
char *p=train, *q=train,c;
stack S;
InitStack(S);
while(*p!='\0'){
if(*p=='H')
Push(S,*p);
else
*(q++)=*p;
p++;
}
while(!IsEmpty(S)){
Pop(S,c);
*(q++)=c;
}
}
6.一个栈实现递归函数计算
double p(int n,double x){
struct stack{
int no;
double val; //保存Pn的值
}st[MaxSize];
int top=-1,i;
double fv1=1,fv2=2*x;
for(i=n;i>=2;i--){
top++;
st[top].no=i;
}
while(top>=0){
st[top].val=2*x*fv2-2*(st[top].no-1)*fv1;
fv1=fv2;
fv2=st[top].val;
top--;
}
if(n==0) return fv1;
else return fv2;
}
7.渡口管理
Queue q; //渡船载渡队列
Queue q1; //客车队列
Queue q2; //货车队列
void manager(){
int i=0,j=0;
while(j<10){
if(i<4&&!QueueEmpty(q1)){
Dequeue(q1,x);
Enqueue(q,x);
i+++,j++;
}
else if(i=4&&!QueueEmpty(q2)){
Dequeue(q2,x);
Enqueue(q,x);
j++,i=0;
}
else{
while(j<10&&i<4&&!QueueEmpty(q2)){
Dequeue(q2,x);
Enqueue(q,x);
i++,j++;
}
i=0;
}
if(QueueEmpty(q1)&&QueueEmpty(q2))
j=11;
}
}