当前位置:   article > 正文

【C++数据结构】用栈实现回文字符串的判断(类模板)_用栈实现回文判断的算法

用栈实现回文判断的算法

目录

前言:

一、回文字符串判断方法

二、代码实现

1.创建结点

2.创建栈

(1)入栈函数        

(2)出栈函数

(3)清空函数

3.回文判断

(1)创建一个string对象用于存放输出的字符串,创建一个char类型的栈。

(2)将字符串逐个入栈。 

(3)遍历字符串并逐个出栈进行判断。

(4)将上面过程封装成函数,调用函数便可以进行判断。

4.main函数

三、完整代码


前言:

        栈实现的是一种后进先出(last-in,first-out,LIFO)策略,将一个正序的数组入并出后可以得到逆序数组,利用这个特点我们可以很简便地实现回文字符串的判断。


提示:以下是本篇文章正文内容,代码注释较为详细,可供参考

一、回文字符串判断方法

        对于一个字符串,如果正读和反读是一样的,那么这个字符串就是回文字符串(例如:“123aa321”)。从编程的角度来说,本质上可以看作其正反序相等。而逆序又可以通过实现,有了这个思路我们便可以通过以下步骤来实现回文字符串的判断:

1.定义结点Node和栈Stack

2.创建一个并将字符串逐个入

3.将栈中元素逐个出并与字符串逐个比较,若出现不相等的情况返回并输出非回文字符串,若全部相等则为回文字符串。

        下面开始代码详解和演示:

二、代码实现

1.创建结点

        关于结点的建立就不赘述了,这里要注意的是后面要用到的类模板Stack要先提前声明,否则在Node类里声明友元时会报错

  1. template<class T>class Stack; //向前声明
  2. template<class T>
  3. class Node {
  4. private:
  5. T m_data; //数据域
  6. Node* m_next; //指针域
  7. public:
  8. Node(const T& val) {
  9. this->m_data = val;
  10. } //有参构造
  11. Node& operator=(const Node& rhs) = delete; //禁止赋值
  12. friend class Stack<T>; //声明友元
  13. };

2.创建栈

        入栈出栈清空都是基本的写法,不多赘述。

  1. template<class T>
  2. class Stack {
  3. private:
  4. Node<T>* m_top = nullptr; //栈顶指针
  5. public:
  6. Stack() = default; //默认构造
  7. Stack(const Stack&) = delete; //禁止复制
  8. Stack& operator=(const Stack&) = delete; //禁止赋值
  9. ~Stack() {
  10. clear();
  11. }; //析构
  12. void clear(); //清空栈
  13. void push(const T& val); //入栈
  14. void pop();//出栈
  15. bool empty()const {
  16. return this->m_top == nullptr;
  17. } //判断是否为空
  18. const T& top() {
  19. return this->m_top->m_data;
  20. } //取出栈顶元素
  21. };

(1)入栈函数        

  1. template<class T>
  2. void Stack<T>::push(const T& val) {
  3. Node<T>* node = new Node<T>(val);
  4. node->m_next = this->m_top;
  5. this->m_top = node;
  6. }

(2)出栈函数

  1. template<class T>
  2. void Stack<T>::pop() {
  3. if (empty()) {
  4. return;
  5. }
  6. Node<T>* p = this->m_top;
  7. this->m_top = this->m_top->m_next;
  8. delete p;
  9. }

(3)清空函数

  1. template<class T>
  2. void Stack<T>::clear() {
  3. Node<T>* p = nullptr;
  4. while (this->m_top != nullptr) {
  5. p = this->m_top;
  6. this->m_top = this->m_top->m_next;
  7. delete p;
  8. }
  9. }

3.回文判断

(1)创建一个string对象用于存放输出的字符串,创建一个char类型的栈。

        这里选用char类型是因为其既能存放数字也能存放字母,并可以使用==运算符判断。

  1. string str; //创建一个string对象,用于存储输入的字符串
  2. cout << "请输入字符串:";
  3. cin >> str;

(2)将字符串逐个入栈。 

        注意这里并未考虑中间空格的情况,如有需要可以自行加入跳过空格的判断。

  1. for (int i = 0; i < str.size(); i++) {
  2. reverse_str.push(str[i]);
  3. } //将字符串依次入栈

(3)遍历字符串并逐个出栈进行判断。

        注意要定义一个char对象用来存放字符串的单个字符,这样才能和Stack<char>内的元素进行==运算符判断,判断时调用top()获取栈顶元素,判断完后调用pop()将之前的栈顶元素出栈,便可进行下一次判断。

  1. for (int j = 0; j < str.size(); j++) {
  2. char contract = str[j]; //创建一个char类型对象用来存放str[i]的单个字符,用于判断和依次出栈的char字符是否相等
  3. if (reverse_str.top() != contract) {
  4. cout << "此字符串不是回文字符串!" << endl;
  5. return;
  6. } //若遇到一个不相等的直接输出结果并返回
  7. else reverse_str.pop();
  8. } //for遍历str的每个字符进行比较
  9. cout << "此字符串是回文字符串!" << endl; //若遍历完都无不相等的则说明为回文,输出结果

(4)将上面过程封装成函数,调用函数便可以进行判断。

  1. void check() {
  2. string str; //创建一个string对象,用于存储输入的字符串
  3. cout << "请输入字符串:";
  4. cin >> str;
  5. Stack<char> reverse_str; //创建一个栈
  6. for (int i = 0; i < str.size(); i++) {
  7. reverse_str.push(str[i]);
  8. } //将字符串依次入栈
  9. for (int j = 0; j < str.size(); j++) {
  10. char contract = str[j]; //创建一个char类型对象用来存放str[i]的单个字符,用于判断和依次出栈的char字符是否相等
  11. if (reverse_str.top() != contract) {
  12. cout << "此字符串不是回文字符串!" << endl;
  13. return;
  14. } //若遇到一个不相等的直接输出结果并返回
  15. else reverse_str.pop();
  16. } //for遍历str的每个字符进行比较
  17. cout << "此字符串是回文字符串!" << endl; //若遍历完都无不相等的则说明为回文,输出结果
  18. }

4.main函数

        简洁明了,这就是抽象和封装的好处。

  1. int main()
  2. {
  3. check(); //调用check()函数
  4. }

三、完整代码

        以下是完整代码展示,由于个人水平有限,如有错误/不严谨的地方敬请指正。

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. template<class T>class Stack; //向前声明
  5. template<class T>
  6. class Node {
  7. private:
  8. T m_data; //数据域
  9. Node* m_next; //指针域
  10. public:
  11. Node(const T& val) {
  12. this->m_data = val;
  13. } //有参构造
  14. Node& operator=(const Node& rhs) = delete; //禁止赋值
  15. friend class Stack<T>; //声明友元
  16. };
  17. template<class T>
  18. class Stack {
  19. private:
  20. Node<T>* m_top = nullptr; //栈顶指针
  21. public:
  22. Stack() = default; //默认构造
  23. Stack(const Stack&) = delete; //禁止复制
  24. Stack& operator=(const Stack&) = delete; //禁止赋值
  25. ~Stack() {
  26. clear();
  27. }; //析构
  28. void clear(); //清空栈
  29. void push(const T& val); //入栈
  30. void pop();//出栈
  31. bool empty()const {
  32. return this->m_top == nullptr;
  33. } //判断是否为空
  34. const T& top() {
  35. return this->m_top->m_data;
  36. } //取出栈顶元素
  37. };
  38. template<class T>
  39. void Stack<T>::push(const T& val) {
  40. Node<T>* node = new Node<T>(val);
  41. node->m_next = this->m_top;
  42. this->m_top = node;
  43. }
  44. template<class T>
  45. void Stack<T>::pop() {
  46. if (empty()) {
  47. return;
  48. }
  49. Node<T>* p = this->m_top;
  50. this->m_top = this->m_top->m_next;
  51. delete p;
  52. }
  53. template<class T>
  54. void Stack<T>::clear() {
  55. Node<T>* p = nullptr;
  56. while (this->m_top != nullptr) {
  57. p = this->m_top;
  58. this->m_top = this->m_top->m_next;
  59. delete p;
  60. }
  61. }
  62. void check() {
  63. string str; //创建一个string对象,用于存储输入的字符串
  64. cout << "请输入字符串:";
  65. cin >> str;
  66. Stack<char> reverse_str; //创建一个栈
  67. for (int i = 0; i < str.size(); i++) {
  68. reverse_str.push(str[i]);
  69. } //将字符串依次入栈
  70. for (int j = 0; j < str.size(); j++) {
  71. char contract = str[j]; //创建一个char类型对象用来存放str[i]的单个字符,用于判断和依次出栈的char字符是否相等
  72. if (reverse_str.top() != contract) {
  73. cout << "此字符串不是回文字符串!" << endl;
  74. return;
  75. } //若遇到一个不相等的直接输出结果并返回
  76. else reverse_str.pop();
  77. } //for遍历str的每个字符进行比较
  78. cout << "此字符串是回文字符串!" << endl; //若遍历完都无不相等的则说明为回文,输出结果
  79. }
  80. int main()
  81. {
  82. check(); //调用check()函数
  83. }

  


之后也会每周更新C++数据结构和算法的相关内容,将逐渐由浅入深,感兴趣的朋友可以点个赞和关注。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/934785
推荐阅读
相关标签
  

闽ICP备14008679号