判断表达式中的括号是否匹配
一.问题描述
给定一个算数表达式,算式中可能包括括号,括号的类型有大括号,小括号,中括号。输入为字符串类型,程序判断
算式中的括号是否匹配。
二.问题分析
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;
}