2)改进进制转换函数,使之能实现整数(正、0、负)的任意进制(2到62,大于9时,用A-Z、a-z表示)的转换。 2.改进符号匹配算法。 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表示左边多。
时间: 2024-03-22 07:38:11 浏览: 24
很好,我会尽力回答你的问题。
关于第一个问题,你需要改进进制转换函数和符号匹配算法。下面分别给出改进的方案:
1. 改进进制转换函数
你可以使用以下代码实现整数的任意进制转换:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
char* itoa(int value, char* str, int base) {
int i = 0;
int sign = 0;
char temp[64];
if (value < 0) {
sign = 1;
value = -value;
}
do {
temp[i++] = digits[value % base];
value /= base;
} while (value);
if (sign) {
temp[i++] = '-';
}
temp[i] = '\0';
int j;
for (j = 0; i > 0; ++j, --i) {
str[j] = temp[i - 1];
}
str[j] = '\0';
return str;
}
```
其中,`value`为要转换的数,`str`为转换后的字符串,`base`为进制数。例如,`itoa(123, str, 16)`表示将十进制数123转换为16进制数。如果要将负数转换为任意进制,可以在转换前将其取相反数,然后在转换后加上负号即可。
2. 改进符号匹配算法
(1)添加栈操作函数
你可以使用以下代码实现栈操作函数:
```
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct {
char* base;
char* top;
int stacksize;
} Stack;
void InitStack(Stack& S) {
S.base = (char*)malloc(STACK_INIT_SIZE * sizeof(char));
if (!S.base) {
exit(-1);
}
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
}
void push(Stack& S, char e) {
if (S.top - S.base >= S.stacksize) {
S.base = (char*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(char));
if (!S.base) {
exit(-1);
}
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*(S.top++) = e;
}
void pop(Stack& S, char& e) {
if (S.top == S.base) {
exit(-1);
}
e = *(--S.top);
}
char GetTop(Stack& S) {
if (S.top == S.base) {
exit(-1);
}
return *(S.top - 1);
}
int StackEmpty(Stack& S) {
if (S.top == S.base) {
return 1;
} else {
return 0;
}
}
```
(2)改进匹配函数
你可以使用以下代码实现改进后的匹配函数:
```
int Matching(char* str) {
Stack S;
InitStack(S);
int i = 0;
char ch;
int flag = 1;
while (str[i] != '\0' && flag) {
ch = str[i];
switch (ch) {
case '(':
case '[':
push(S, ch);
break;
case ')':
if (!StackEmpty(S) && GetTop(S) == '(') {
char x;
pop(S, x);
} else {
flag = 0;
}
break;
case ']':
if (!StackEmpty(S) && GetTop(S) == '[') {
char x;
pop(S, x);
} else {
flag = 0;
}
break;
default:
break;
}
i++;
}
if (StackEmpty(S) && flag) {
return 1; // 匹配
} else if (!StackEmpty(S) && flag) {
if (GetTop(S) == '(') {
return -1; // 右边多
} else {
return -2; // 左边多
}
} else {
return 0; // 交叉错误
}
}
```
其中,`str`为要匹配的字符串。返回值为1表示匹配,0表示交叉错误,-1表示右边多,-2表示左边多。
相关推荐
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![cpp](https://img-home.csdnimg.cn/images/20210720083646.png)
![cbp](https://img-home.csdnimg.cn/images/20210720083646.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)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)