用栈判断表达式中的括号是否匹配

判断表达式中的括号是否匹配

一.问题描述

          给定一个算数表达式,算式中可能包括括号,括号的类型有大括号,小括号,中括号。输入为字符串类型,程序判断

    算式中的括号是否匹配。


二.问题分析

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

    原文作者:括号匹配问题
    原文地址: https://blog.csdn.net/yg_hou/article/details/51159578
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞