int Matching( void ) {Stack S; InitStack( S ); int flag = 1; char ch; scanf(“%c”, &ch ); while( ch!=‘#’ && flag ){ switch( ch){ case ‘[‘: case ‘(‘: push( S, ch ); break; case ‘)’: if( !StackEmpty(S)&&GetTop(S)==‘(‘ ) pop(S,x); else flag = 0; break; case ‘]’: if( !StackEmpty(S)&&GetTop(S)==‘[‘ ) pop(S,x); else flag = 0; break; } scanf(“%c”, &ch ); } if (StackEmpty( S ) && flag) return 1; else return 0; } void main( ) { int i; i = Matching( ); if( i==1 ) printf(“匹配!”); else printf(“不匹配!”); } (1)添加栈操作函数,使上面的程序能够运行。 (2)改进匹配函数(函数另外命名),使之能通过返回值进行更细致的区分:1表示正确、0表示交叉错误、-1表示右边多、-2表示左边多。 (3)改进匹配函数(函数另外命名),使之能实现左右花括号{}、 左右双引号、左右单引号、左右尖括号< >,以及注释/* */是否匹配的判断。 (4)改进匹配函数(函数另外命名),使之能从
时间: 2024-04-02 17:37:24 浏览: 15
(1) 以下是添加栈操作函数的代码:
typedef struct {
char* base; // 栈底指针
char* top; // 栈顶指针
int size; // 栈的大小
} Stack;
// 初始化栈
void InitStack(Stack &S, int size = 100) {
S.base = new char[size];
S.top = S.base;
S.size = size;
}
// 判断栈是否为空
bool StackEmpty(Stack S) {
return S.top == S.base;
}
// 获取栈顶元素
char GetTop(Stack S) {
if (!StackEmpty(S)) {
return *(S.top - 1);
}
return '\0';
}
// 元素入栈
void Push(Stack &S, char x) {
if (S.top - S.base == S.size) {
printf("Stack Overflow!");
exit(0);
}
*(S.top++) = x;
}
// 元素出栈
void Pop(Stack &S, char &x) {
if (StackEmpty(S)) {
printf("Stack Underflow!");
exit(0);
}
x = *(--S.top);
}
(2) 以下是改进匹配函数的代码,能够通过返回值进行更细致的区分:
int Matching() {
Stack S;
InitStack(S);
int flag = 1;
char ch, x;
scanf("%c", &ch);
while (ch != '#' && flag) {
switch (ch) {
case '[':
case '(':
Push(S, ch);
break;
case ')':
if (!StackEmpty(S) && GetTop(S) == '(') {
Pop(S, x);
} else {
flag = 0;
}
break;
case ']':
if (!StackEmpty(S) && GetTop(S) == '[') {
Pop(S, x);
} else {
flag = 0;
}
break;
}
scanf("%c", &ch);
}
if (StackEmpty(S) && flag) {
return 1; // 匹配
} else if (GetTop(S) == '(') {
return -2; // 左边多
} else if (flag == 0 && ch == '#') {
return -1; // 右边多
} else {
return 0; // 交叉错误
}
}
(3) 以下是改进匹配函数的代码,能够实现更多类型的括号匹配:
int Matching() {
Stack S;
InitStack(S);
int flag = 1;
char ch, x;
scanf("%c", &ch);
while (ch != '#' && flag) {
switch (ch) {
case '[':
case '(':
case '{':
case '<':
Push(S, ch);
break;
case ')':
if (!StackEmpty(S) && GetTop(S) == '(') {
Pop(S, x);
} else {
flag = 0;
}
break;
case ']':
if (!StackEmpty(S) && GetTop(S) == '[') {
Pop(S, x);
} else {
flag = 0;
}
break;
case '}':
if (!StackEmpty(S) && GetTop(S) == '{') {
Pop(S, x);
} else {
flag = 0;
}
break;
case '>':
if (!StackEmpty(S) && GetTop(S) == '<') {
Pop(S, x);
} else {
flag = 0;
}
break;
case '\'':
if (!StackEmpty(S) && GetTop(S) == '\'') {
Pop(S, x);
} else {
Push(S, ch);
}
break;
case '\"':
if (!StackEmpty(S) && GetTop(S) == '\"') {
Pop(S, x);
} else {
Push(S, ch);
}
break;
case '/':
scanf("%c", &ch);
if (ch == '*') {
Push(S, ch);
}
break;
case '*':
scanf("%c", &ch);
if (ch == '/') {
if (!StackEmpty(S) && GetTop(S) == '/') {
Pop(S, x);
}
}
break;
}
scanf("%c", &ch);
}
if (StackEmpty(S) && flag) {
return 1; // 匹配
} else if (GetTop(S) == '(' || GetTop(S) == '{' || GetTop(S) == '[' || GetTop(S) == '<') {
return -2; // 左边多
} else if (flag == 0 && ch == '#') {
return -1; // 右边多
} else {
return 0; // 交叉错误
}
}
(4) 由于没有具体要求,这里只是给出一种改进匹配函数的思路,能够从文件中读取括号匹配的文本并进行匹配,具体实现方式可以根据需求进行修改:
int MatchingFromFile() {
Stack S;
InitStack(S);
int flag = 1;
char ch, x;
FILE *fp;
fp = fopen("brackets.txt", "r");
if (fp == NULL) {
printf("Failed to open file!");
exit(0);
}
ch = fgetc(fp);
while (ch != EOF && flag) {
switch (ch) {
case '[':
case '(':
case '{':
case '<':
Push(S, ch);
break;
case ')':
if (!StackEmpty(S) && GetTop(S) == '(') {
Pop(S, x);
} else {
flag = 0;
}
break;
case ']':
if (!StackEmpty(S) && GetTop(S) == '[') {
Pop(S, x);
} else {
flag = 0;
}
break;
case '}':
if (!StackEmpty(S) && GetTop(S) == '{') {
Pop(S, x);
} else {
flag = 0;
}
break;
case '>':
if (!StackEmpty(S) && GetTop(S) == '<') {
Pop(S, x);
} else {
flag = 0;
}
break;
case '\'':
if (!StackEmpty(S) && GetTop(S) == '\'') {
Pop(S, x);
} else {
Push(S, ch);
}
break;
case '\"':
if (!StackEmpty(S) && GetTop(S) == '\"') {
Pop(S, x);
} else {
Push(S, ch);
}
break;
case '/':
ch = fgetc(fp);
if (ch == '*') {
Push(S, ch);
}
break;
case '*':
ch = fgetc(fp);
if (ch == '/') {
if (!StackEmpty(S) && GetTop(S) == '/') {
Pop(S, x);
}
}
break;
}
ch = fgetc(fp);
}
if (StackEmpty(S) && flag) {
return 1; // 匹配
} else if (GetTop(S) == '(' || GetTop(S) == '{' || GetTop(S) == '[' || GetTop(S) == '<') {
return -2; // 左边多
} else {
return 0; // 交叉错误或右边多
}
}
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![.pdf](https://img-home.csdnimg.cn/images/20210720083646.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)