棧和佇列的簡單應用
阿新 • • 發佈:2019-01-04
1:編寫一個演算法來判別表示式中的括號是否匹配,以字元"\0"作為算術表示式的結束符。(圓括號,花括號,中括號三種類型)
基本思想:
1)掃描每個字元,遇到花、中、圓的左括號進棧
2)遇到花、中、圓的右括號時檢查棧頂元素是否為對應的左括號。若是,退棧,否則配對錯誤。
3)最後棧不為空也錯誤。
bool Check(char *str){ stack<char> s; int i=0; char ch; while(str[i]!='\0'){ switch(str[i]){ //左括號入棧 case '(':s.push(str[i]);break; case '[':s.push(str[i]);break; case '{':s.push(str[i]);break; //遇到右括號,檢測棧頂 case ')':ch=s.top();s.pop(); if(ch!='(') return false; break; case ']':ch=s.top();s.pop(); if(ch!='[') return false; break; case '}':ch=s.top();s.pop(); if(ch!='{') return false; break; default: break; }//switch i++; }//while if(!s.empty()) return false; return true; }
2:用兩個棧s1和s2模擬一個佇列
演算法思想:
1)對s2的出棧操作用作出隊,若s2為空,則將s1的所有元素送入s2
2)對s1的入棧操作用作入隊,若s1滿,必須先保證s2空,才能將s1中的所有元素插入s2中
入隊演算法:
bool EnQueue(Stack &s1,Stack &s2,ElemType e){ if(StackOverflow(s1) && !StackEmpty(s2)){ printf("佇列滿"); return false; } if(!StackOverflow(s1)){ push(s1,e); return true; } if(StackOverflow(s1) && StackEmpty(s2)){ while(!StackEmpty(s1)){ pop(s1,x); push(s2,x); } } push(s1,e); return true; }
出隊演算法:
void DeQueue(Stack &s1,Stack &s, ElemType &x){
if(!StackEmpty(s2)){
pop(s2,x);
}
else if(StackEmpty(s1))
printf("佇列為空");
else{
while(!StackEmpty(s1)){
pop(s1,x);
push(s2,x);
}
pop(s2,x);
}
}
判空:
bool QueueEmpty(Stack &s1,Stack &s){ if(StackEmpty(s1) && StackEmpty(s2)) return true; return false; }
3:以I表示入棧,O表示出棧,棧的初態和終態都是空的,判斷一個給定的IO序列是否合法
方法一:
1)逐一掃描序列,每掃描到‘O’字元,檢查出入棧次數,若出棧次數大於入棧次數,則序列非法。
2)掃描結束後,再判斷出入棧次數是否相等,若不等,則為非法序列。
bool Judge(char A[]){
int i=j=k=0;
while(A[i]!='\0'){
switch(A[i]){
case 'I':j++;break;
case 'O':k++;
if(k>j) return false;
break;
}
i++;
}
if(i!=k) return false;
return true;
}
方法二:入棧加一,出棧減一,對序列的判斷轉化為對-1、1的判斷。若任意字首子序列累加和不小於0且最終序列和為0,則為合法序列,否則為非法序列。
4:共享棧
設有兩棧s1、s2都採用順序棧形式,並且共享一個儲存區[0,...maxsize-1],為了儘量利用空間,減少溢位可能,採用棧頂相向,迎面增長的儲存方式。下面給出s1、s2有關入棧、出棧操作
資料結構:
#define maxsize 100
#define ElemType int
typedef struct{
ElemType stack[maxsize];
int top[2];
}stk;
stk s;
入棧:
bool input(int i,ElemType x){
//i為棧號,i=0表示s1,i=1表示s2
if(i<0 || i>1) return false;//棧號不對
if(s.top[1]-s.top[1]==1){
printf("棧滿\n");
return false;
}
switch(i){
case 0:s.stack[++s.top[0]]=x;return true;break;
case 1:s.stack[++s.top[1]]=x;return true;break;
}
}
出棧:
int output(int i){
if(i<0 || i>1) return false;//棧號不對
switch(i){
case 0:
if(s.top[0]==-1){
printf("棧空\n");
return -9999;
}
else
return s.stack[s.top[0]--];
case 1:
if(s.top[1]==maxsize){
printf("棧空\n");
return -9999;
}
else
return s.stack[s.top[1]--];
}
}