用c语言完成以下程序1编写一个判别表达式中开、闭括号是否配对出现的程序。 2 假设称正读和反读都相同的字符序列为“回文”,例如“abba”和“abcba”是回文,“abcde”和 “ababab”则不是回文。试写一个程序判别读入的一个以”@”为结束符的字符序列是否为回文。
时间: 2024-12-09 22:16:35 浏览: 14
1. 在C语言中,编写一个判断表达式中括号是否匹配的程序,可以使用栈数据结构。首先,创建一个空栈,然后遍历输入的字符。如果遇到左括号(如'{', '(', '['),将其压入栈中;如果遇到右括号,检查栈顶元素是否与其配对。如果配对,弹出栈顶元素;如果不配对,说明括号未关闭,返回错误。遍历完所有字符后,若栈为空,则表示括号配对,否则不匹配。
```c
#include <stdio.h>
#include <stdbool.h>
bool is_bracket_matched(char* expression) {
stack_t brackets = {0};
int open[6] = {'{', '[', '(', '{', '[', '('}; // 配对的左括号及其下标
int close[6] = {'}', ']', ')', '}', ']', ')'};
for (char c : expression) {
if (c == '@') break; // 结束条件
else if (c == open[brackets.top]) {
brackets.top--;
} else if (c == close[brackets.top]) {
brackets.top++;
} else {
return false;
}
}
return brackets.top == 0; // 如果栈为空,表示括号已完全配对
}
int main() {
char input[100];
printf("Enter an expression: ");
fgets(input, sizeof(input), stdin);
input[strlen(input)-1] = '\0'; // remove the newline character
if (is_bracket_matched(input)) {
printf("The brackets are properly matched.\n");
} else {
printf("The brackets are not properly matched.\n");
}
return 0;
}
```
2. 判断回文串的程序,可以先忽略大小写并删除非字母数字字符,然后再将字符串翻转并与原字符串对比,若相等则是回文。
```c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
bool is_palindrome(const char *str) {
int len = strlen(str);
str = strtok(str, "@"); // ignore '@' and convert to lowercase
for (char *c = strtok(NULL, ""); c != NULL; c = strtok(NULL, "")) {
c = tolower(c); // convert to lower case
if (!isalnum(c)) continue; // skip non-alphanumeric characters
}
char reversed[len + 1]; // extra space for null terminator
strcpy(reversed, str);
reverse(reversed);
return strcmp(str, reversed) == 0;
}
int main() {
char input[100];
printf("Enter a string (ends with @): ");
fgets(input, sizeof(input), stdin);
input[strlen(input)-1] = '\0';
if (is_palindrome(input)) {
printf("The string is a palindrome.\n");
} else {
printf("The string is not a palindrome.\n");
}
return 0;
}
```
阅读全文