1. 程式人生 > >用棧判斷表示式中的括號是否匹配

用棧判斷表示式中的括號是否匹配

判斷表示式中的括號是否匹配

一.問題描述

          給定一個算數表示式,算式中可能包括括號,括號的型別有大括號,小括號,中括號。輸入為字串型別,程式判斷

    算式中的括號是否匹配。

二.問題分析

         1.此題可用棧結構來解決。演算法的核心思想為:遇到一個左括號將此左括號入棧,遇到一個右括號時,出棧一個左括號。

      2.當出現以下情況時,可判斷此表示式括號不匹配:①出棧的左括號與右括號型別不同,例 “{” 和“)”。②遇到右括號時,

       棧中已沒有左括號③已到字串結尾,棧中還有左括號。

三.關鍵函式

Boolean check(char *s)
{
	int i=0;
	STACK st;
	st=makeNull(st);
	 
	while(s[i]!='\n'){
		if(s[i]=='('||s[i]=='['||s[i]=='{'){//左括號入棧 
			push(st,s[i]);
			i++;
		}
		else{
			if(st.size==0)
				return FALSE;
			else if(top(st)!=s[i])
				return FALSE;
			else{
				pop(st);//左右括號匹配 
				i++;
			} 
		}
	}
	if(st.size!=0)
		return FALSE;//還有左括號,不匹配
	return FALSE; 
}

四.完整程式

        程式中給了棧的型,並給出了棧的一些基本操作。

/*十一、假設表示式中允許包含三種括號:圓括號、方括號和大括號。
設計一個演算法採用順序棧(用陣列表示的棧)判斷表示式中的括號是否正確配對。
要求:
    1、定義棧以及棧的型,棧中所存放元素的型別為字元型,定義列舉型別Boolean,其中兩個元素分別為TRUE和FALSE。
	2、定義棧的各種操作。
	3、定義函式Boolean check(char *s); 判斷s中的括號是否正確配對,如果正確配對,返回TRUE,否則返回FALSE。
	4、在主函式中驗證所編寫函式的正確性。
*/ 
#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstdlib>
#include<string>
using namespace std;
#define MAX 1000002
enum Boolean{//列舉變數Boolean 
	TRUE,
	FALSE
};
typedef char elementtype;

struct STACK{
	elementtype element[MAX];
	int size; 
};

/*empty() 堆疊為空則返回真 
pop() 移除棧頂元素 
push() 在棧頂增加元素 
size() 返回棧中元素數目 
top() 返回棧頂元素 
*/
STACK makeNull(STACK &s)//將棧置空 
{
	s.size=0;
	return s;
}

Boolean empty(STACK s)
{
	if(s.size==0)
		return TRUE;
	return FALSE;
}

int size(STACK s)
{
	return s.size;
}

elementtype top(STACK s)
{
	if(s.size==0)
		exit(1);
	else
		return s.element[0];
}

void push(STACK s,elementtype e)
{
	if(s.size==0){
		s.element[0]=e;
		s.size++;
	}
	else{
		for(int i=s.size;i>0;i--){
			s.element[i]=s.element[i-1];
		}
		s.element[0]=e;
		s.size++;
	}
}

void pop(STACK s)
{
	if(s.size==0)
		return;
	if(s.size==1){
		s.size=0;
		return;
	}
	for(int i=0;i<s.size-1;i++){
		s.element[i]=s.element[i+1];
	}
	s.size--;
} 

Boolean check(char *s)
{
	int i=0;
	STACK st;
	st=makeNull(st);
	 
	while(s[i]!='\n'){
		if(s[i]=='('||s[i]=='['||s[i]=='{'){//左括號入棧 
			push(st,s[i]);
			i++;
		}
		else{
			if(st.size==0)
				return FALSE;
			else if(top(st)!=s[i])
				return FALSE;
			else{
				pop(st);//左右括號匹配 
				i++;
			} 
		}
	}
	if(st.size!=0)
		return FALSE;//還有左括號,不匹配
	return FALSE; 
}
int main()
{ 
  return 0;
}