70,023
社区成员




/*课后习题1.8-h
h. 假设表达式中允许包含3中括号:圆括号、方括号和大括号。
设计一个算法采用顺序栈判断表达式中的括号是否正确配对。
void Bracketmatch(const char* c)
*/
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
class stack {
private:
int maxsize;
int top;
char* st;
public:
stack(int size)
{
maxsize = size;
top = -1;
st = new char[maxsize];
}
void push(char item)
{
st[++top] = item;
}
char top1()
{
return st[top];
}
void pop()
{
top--;
}
bool empty()
{
return top == -1;
}
};
/*
TODO:计一个算法采用顺序栈判断表达式c中的括号是否正确配对。
输出:1. 遍历表达式c过程中,匹配错误 cout << c[i] << " 匹配错误" << endl;
2. 遍历之后,栈为空,则匹配正确,cout << "匹配正确!" << endl;
若不为空,则 cout << s1.top1() << " 匹配错误" << endl;
*/
void Bracketmatch(const char* c) //括号匹配
{
bool bj=true;
char t;
stack s1(strlen(c)+1);
for (unsigned int i = 0; i < strlen(c); i++)
{
t = c[i];
switch (t)
{
case '(':
s1.push(t);
break;
case '[':
s1.push(t);
break;
case '{':
s1.push(t);
break;
case ')':
if (s1.top1() == '(')
{
s1.pop();
break;
}
else
{
cout << c[i] << " 匹配错误" << endl;
bj = false;
break;
}
case ']':
if (s1.top1() == '[')
{
s1.pop();
break;
}
else
{
cout << c[1] << " 匹配错误" << endl;
bj = false;
break;
}
case '}':
if (s1.top1() == '{')
{
s1.pop();
break;
}
else
{
cout << c[i] << " 匹配错误" << endl;
bj = false;
break;
}
default:
break;
}
}
if (bj)
{
if (s1.empty())
{
cout << "匹配正确!" << endl;
}
else
cout << s1.top1() << " 匹配错误" << endl;
}
}
int main()
{
string s;
getline(cin, s);
Bracketmatch(s.c_str());
return 0;
}
void Bracketmatch(const char* c) //括号匹配
{
bool bj=true;
char t;
stack s1(strlen(c)+1);
for (unsigned int i = 0; i < strlen(c); i++)
{
t = c[i];
switch (t)
{
case '(':
s1.push(t);
break;
case '[':
s1.push(t);
break;
case '{':
s1.push(t);
break;
case ')':
if (s1.top1() == '(')
{
s1.pop();
break;
}
else
{
cout << c[i] << " 匹配错误" << endl;
bj = false;
break;
}
case ']':
if (s1.top1() == '[')
{
s1.pop();
break;
}
else
{
cout << c[1] << " 匹配错误" << endl;
bj = false;
break;
}
case '}':
if (s1.top1() == '{')
{
s1.pop();
break;
}
else
{
cout << c[i] << " 匹配错误" << endl;
bj = false;
break;
}
default:
break;
}
if (!bj) break; //加这一句就好了,只要有错,就不再继续往下查找匹配了
}
if (bj)
{
if (s1.empty())
{
cout << "匹配正确!" << endl;
}
else
cout << s1.top1() << " 匹配错误" << endl;
}
}