數據結構習題--棧與隊列(2)
阿新 • • 發佈:2019-05-13
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)