1. 程式人生 > >棧和佇列的簡單應用

棧和佇列的簡單應用

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]--];
	}
}