zoukankan      html  css  js  c++  java
  • 【数据结构】2-1 回文问题

    我这种方式其实挺傻的···

    相当于是用数组的形式实现了栈的功能

    其实完全没有必要

    比较回文直接入栈后,不断用栈顶和栈底元素相互比较一下就OK

    下面是源代码:(注释部分请自行忽略,主要是直接用栈的功能改过来的)

    /*我看见,有星河揉碎在我眼前,
    静悄悄化为天上璀璨的云烟,寂静美好。 
    那时候的天空澄澈,夕阳下的夏日凉风习习,
    你抱着吉他,眼里似乎有着通向另一个世界的光。
    那时候我们都囿于学业和未可知的未来,
    我们唱着跳着,哭着挣扎着,也这样一路前行着……*/
    #include<iostream>
    #include<cstring>
    using namespace std;
    struct Node {
        char word;
        Node *next;
    };
    class LinkStack {
    private:
        Node *top;        //Top指针
        int number;
    public:
        LinkStack();
        ~LinkStack();
        void Push(char _word);
        char Pop();            //出栈
        char Top();            //取顶部元素
        bool Empty();        //判断是否为空栈
        void StackTraverse();//打印栈中元素
        void filter();        //过滤:空格
        void palindromeJudge(); //判断是否为回文
    };
    void LinkStack::palindromeJudge()
    {
        if (number == 0)
        {
            cout << "error" << endl;
            exit(1);
        }
        bool flag = true;
        filter();
        char *s = new char[number + 10];
        Node *p = top;
        cout << "这个打印的是栈顶元素" << p->word << endl;
        for(int i=number-1;i>=0;i--)
        {
            s[i] = p->word;
            p = p->next;
        }
    
        Node *h = top;
        for (int i = 0; i < number; i++)
        {
            if (s[i] != h->word)
            {
                flag = false;
                break;
            }
            h = h->next;
        }
        if (flag)
        {
            StackTraverse();
            cout << "是回文" << endl;
        }
        else
        {
            StackTraverse();
            cout << "不是回文" << endl;
        }
    
    }
    void LinkStack::filter()
    {
        if (Empty() == false)
        {
            Node *p=top;
            while (p->next!=NULL)
            {
                if (p->word == ' ')
                {
                    Node *d = p;
                    while (d->next != NULL)
                    {
                        d->word = d->next->word;
                        d = d->next;
                    }
                    d = NULL;
                    number--;
                }
                p = p->next;
            }
        }
    }
    void LinkStack::StackTraverse()
    {
        if (Empty())
        {
            cout << "error!" << endl;
            exit(1);
        }
        Node *p = top;
        while (p!=NULL)
        {
            cout << p->word;
            p = p->next;
        }
        cout << endl;
    
    
    }
    LinkStack::LinkStack()
    {
        top = NULL;
        number = 0;
    }
    LinkStack::~LinkStack()
    {
        Node *p = top;
        while (p)
        {
            Node *q = p;
            p = p->next;
            delete q;
        }
        top = NULL;
    }
    void LinkStack::Push(char _word)
    {
        //top默认为空,所以不需要讨论是否要让最先进去的那个元素的Next为空的情况
        Node *s = new Node;
        s->word = _word;
        s->next = top;
        top = s;
        number++;
    }
    char LinkStack::Pop()
    {
        char x;
        if (top == NULL)
        {
            cout << "下溢" << endl;
            exit(1);
        }
        x = top->word;
        Node *p = top;
        top = top->next;
        delete p;
        number--;
        return x;
    }
    char LinkStack::Top()
    {
        if (top == NULL)
        {
            cout << "下溢" << endl;
            exit(1);
        }
        return top->word;
    }
    bool LinkStack::Empty()
    {
        return top == NULL;
    }
    int main()
    {
        LinkStack p;
        char x[50];
        int number;
        cout << "请输要入栈的语句:";
        scanf_s("%[^
    ]]", x, 50);
        number=strnlen_s(x, 50);
        cout <<"您输入了"<< number << "个字符"<<endl;
        for (int i = 0; i < number; i++)
        {
            p.Push(x[i]);
        }
        cout << "打印栈中元素:" << endl;
        p.StackTraverse();
        p.palindromeJudge();
        //cout << "出栈功能:" << endl;
        //cout << p.Pop() << "已完成出栈" << endl;
        //cout << "打印栈中元素:" << endl;
        //p.StackTraverse();
        //cout << "栈中顶部元素为:" << p.Top() << endl;
        //cout << "打印栈中元素:" << endl;
        //p.StackTraverse();
        system("pause");
        return 0;
    
    }
  • 相关阅读:
    转!!javaMail使用网易163邮箱报535 Error: authentication failed
    银行卡验证(验证是否存在,卡号类型,归属行)
    Navicat已经成功连接,密码忘记的解决方法
    Inline&IAT Hook原理
    x64dbg尝鲜
    C# 通过Dynamic访问System.Text.Json对象
    dotnet5将asp.net webapi宿主到wpf
    Asp.Net5 MVC with Vue.js
    在 Visual Studio 中使用跟踪点将信息记录到“输出”窗口中
    WPF带阴影的无边框窗体
  • 原文地址:https://www.cnblogs.com/robotpaul/p/9978077.html
Copyright © 2011-2022 走看看