1. 程式人生 > >數據結構習題--棧與隊列(2)

數據結構習題--棧與隊列(2)

include empty 判斷 efi 單向 return 序列 result sca

雙棧模擬隊列
基本思路:隊列是先進先出,棧是先進後出。用一個輸入棧存進隊元素,用一個輸出棧將輸出棧中的元素倒置,再出棧。這就實現了隊列的先進先出。
註意:隊滿的條件為輸入棧S1滿且輸出棧S2非空。並非輸入棧滿就代表隊列滿,因為如果輸入棧滿但輸出棧空,可以將輸出棧中的元素全部壓入輸出棧中,這就相當於隊列沒滿,同時如果輸出棧中有元素,則輸入棧中的元素不能壓入輸出棧,如果壓入就會打亂原有的序列。

#include<stdio.h>
#include<stdlib.h>
#define maxsize 30
typedef int datatype;
typedef struct{
    datatype data[maxsize];
    int top;
}SeqStack;

void Initial(SeqStack *S){
    S->top = -1;
} 

int StackIsFull(SeqStack *S){
    return S->top == maxsize-1;
}

int StackIsEmpty(SeqStack *S){
    return S->top == -1;
}

int StackPop(SeqStack *S){
    int k;
    if(StackIsEmpty(S))
       return 0;
    k = S->data[S->top--];
    return k;
}

int StackPush(SeqStack *S,datatype x){
    if(StackIsFull(S))
       return 0;
    S->data[++S->top]=x;
    return 1;
}
//判斷隊空 
int QueueIsEmpty(SeqStack *S1,SeqStack *S2){
    return StackIsEmpty(S1)&&StackIsEmpty(S2);  
} 
//進隊列 
int EnQueue(SeqStack *S1,SeqStack *S2,datatype x){
    if(StackIsFull(S1)){  
        if(!StackIsEmpty(S2)){
            printf("用棧模擬的隊列已滿");
            return 0;
        }
        else{
            int k;
            while(!StackIsEmpty(S1)){
               k = StackPop(S1);
               StackPush(S2,k);
            }
        }
    }
    StackPush(S1,x);
    return 1; 
}
// 出隊列 
int DeQueue(SeqStack *S1,SeqStack *S2){
    int  k;
    if(QueueIsEmpty(S1,S2)){
       printf("用棧模擬的隊列已空");
       return 0;
    }
    else{
        if(StackIsEmpty(S2)){
            while(!StackIsEmpty(S1)){
               k = StackPop(S1);
               StackPush(S2,k);
            }
        }
    }
    return StackPop(S2);
}

void ImitateQueue(SeqStack *S1,SeqStack *S2){
    Initial(S1);
    Initial(S2);
    int x;
    printf("請輸入進隊元素:");
    scanf("%d",&x);
    while(x!=0){
        EnQueue(S1,S2,x);
        scanf("%d",&x);
    }
    printf("出隊元素為:");
    while(!QueueIsEmpty(S1,S2)){
        int k;
        k = DeQueue(S1,S2);
        printf("%d",k);
    } 
}

main(){
    SeqStack *S1 = (SeqStack*)malloc(sizeof(SeqStack));
    SeqStack *S2 = (SeqStack*)malloc(sizeof(SeqStack));
    ImitateQueue(S1,S2);
}

鐵道車廂調度問題
調車場兩側的鐵道均為單向行駛道,中間有一段用於調度的“棧道”,調車場的入口有n節硬座和軟座車廂(分別用H和S表示),設計一個算法,把所有軟座車廂調度道硬座車廂前面來。要求輸出對這n節車廂進行調度的結果序列。

#include<stdio.h>
#include<stdlib.h>
#define maxsize 30
typedef struct {
    char data[maxsize];
    int top;
}SeqStack;

void Initial(SeqStack *S){
    S->top = -1;
    } 
    
int IsFull(SeqStack *S){
    return S->top==maxsize-1;
}

int IsEmpty(SeqStack *S){
    return S->top==-1;
}

int Push(SeqStack *S,char x){
    if(IsFull(S))
       return 0;
    S->data[++S->top]=x;
    return 1;
}

char Pop(SeqStack *S){
    char c;
    if(IsEmpty (S))
       return 0;
       c = S->data[S->top];
    S->top--;
    return c;
}

void Railway(SeqStack *S){
    int i,j=0,n=9;
    char train[n] = {'H','S','H','H','S','H','S','S','H'},result[n];
    for(i=0;i<n;i++){
        if(train[i]=='S')
          result[j++]=train[i];
        else{
           Push(S,train[i]);
           }
    }

    while(!IsEmpty(S)){
        for(;j<n;j++){
            result[j]=Pop(S);
        }
    }
    for(j=0;j<n;j++){
        printf("%c",result[j]);
    }
    
}

main(){
    SeqStack *S = (SeqStack*)malloc(sizeof(SeqStack));
    Initial(S);
    Railway(S);
}

數據結構習題--棧與隊列(2)