问题描述:
设计一个算法判断算数表达式的圆括号是否正确匹配
算法思想:
使用栈来实现,当在输入的字符串中检测到‘(’字符时,该字符入栈。当在输入的字符串中检测到‘)’字符时,上一个字符出栈。
最后判断栈是否为空,若为空,则圆括号匹配正确,否则,圆括号匹配不正确。
需要注意的是当‘)’字符最先出现时,直接判断圆括号匹配不正确。
代码实现:
ParenthesisMatch.cpp
#include<string>
#include"SeqStack.h"
using namespace std;
int main()
{
SeqStack<char> stack1; //定义一个顺序栈对象
string s1; //定义一个串
cout<<"请输入算数表达式:";
cin>>s1;
for(int i=0; i<s1.size(); i++) //依次检测每个字符
{
if(s1[i]=='(') //当出现'('时,入栈
stack1.Push(s1[i]);
else if(s1[i]==')' && stack1.Empty()) //当')'最先出现,直接判断圆括号不匹配
{
cout<<"算数表达式圆括号不匹配!"<<endl;
return 0;
}
else if(s1[i]==')' && !stack1.Empty()) //当出现')'且不是最先出现时,上一个字符出栈
stack1.Pop();
}
if(stack1.Empty()) //栈空,则圆括号匹配正确
cout<<"算数表达式圆括号匹配!"<<endl;
else //否则,圆括号匹配不正确
cout<<"算数表达式圆括号不匹配!"<<endl;
return 0;
}
SeqStack.h
#include<iostream>
using namespace std;
const int StackSize = 1024; //定义栈的最大高度
template<class T>
class SeqStack //定义顺序栈的模板类
{
public:
SeqStack(){top = -1;} //构造函数,初始化空栈
void Push(T x); //入栈操作
T Pop(); //出栈操作
T GetTop(); //获得栈顶元素
bool Empty(); //判断栈是否为空
private:
T data[StackSize]; //定义数组
int top; //栈顶指针
};
template<class T>
void SeqStack<T>::Push(T x) //入栈操作
{
if(top >= StackSize-1) throw"上溢";
top++; //栈顶指针上移
data[top] = x;
}
template<class T>
T SeqStack<T>::Pop() //出栈操作
{
if(Empty()) throw"下溢";
top--; //栈顶指针下移
return data[top+1];
}
template<class T>
T SeqStack<T>::GetTop() //查找栈顶元素
{
if(Empty()) throw"下溢";
return data[top];
}
template<class T>
bool SeqStack<T>::Empty()
{
if(top==-1)
return true;
else
return false;
}
实验结果: