用C++写 假设称正读和反读都相同的字符序列为“回文”,例如,‘abba’和‘abcba’是回文, ‘abcde’和‘ababab’则不是回文。 试写一个算法判别读入的一个以‘@’为结束符的字符序列是否是“回文”。 (要求:同时使用栈和队列两种结构)
时间: 2024-10-27 16:04:23 浏览: 33
回文数是指正读和反读都相同的数.docx
在C++中,我们可以分别使用栈(Stack)和队列(Queue)来判断一个字符串是否为回文。以下是两种方法的示例:
**方法一:使用栈**
```cpp
#include <stack>
#include <string>
bool isPalindromeWithStack(string str) {
stack<char> s;
for (char c : str) {
if (c != '@') {
s.push(c);
} else {
break;
}
}
string reversedStr = "";
while (!s.empty()) {
reversedStr += s.top();
s.pop();
}
return str == reversedStr;
}
int main() {
string input;
cout << "请输入字符串(以@结尾): ";
getline(cin, input);
if (isPalindromeWithStack(input)) {
cout << "是回文\n";
} else {
cout << "不是回文\n";
}
return 0;
}
```
**方法二:使用队列**
```cpp
#include <queue>
#include <string>
bool isPalindromeWithQueue(string str) {
queue<char> q;
int left = 0;
int right = str.length() - 1;
while (left < right) {
if (str[left] != '@' && str[right] != '@') {
q.push(str[left]);
left++;
}
if (str[left] != '@' && str[right] != '@') {
q.push(str[right]);
right--;
}
}
string reversedStr = "";
while (!q.empty()) {
reversedStr += q.front();
q.pop();
}
return str == reversedStr;
}
int main() {
string input;
cout << "请输入字符串(以@结尾): ";
getline(cin, input);
if (isPalindromeWithQueue(input)) {
cout << "是回文\n";
} else {
cout << "不是回文\n";
}
return 0;
}
```
这两种方法的主要思路都是忽略掉字符串中的非字母字符,并通过栈或队列将一半字符压入数据结构中,然后再一一取出并与另一半字符对比,如果匹配,则是回文,否则不是。注意,队列在这里主要用于简化操作,实际应用中并不一定比栈更高效。
阅读全文