14.由用户输入n个10以内的数,每当输入i(0<=i<=9),就把它插入到第i号队列中。最后把10个队列中非空队列,按队列号从小到大得顺序串接成一条链,并输出该链 的所有元素。

#include<iostream>
using namespace std;
class Node
{
public:
    int data;
    Node* link;
    Node(int data)
    {
        this->data=data;
        this->link=NULL;
    }
};
class LinkQueue
{
private:
    int size;
    Node* front;
    Node* rear;
public:
    LinkQueue()
    {
        size=0;
        front=rear=NULL;
    }
    ~LinkQueue()
    {
        Clear();
    }
    void Clear()
    {
        while(front!=NULL)
        {
            rear=front;
            front=front->link;
            delete rear;
        }
        rear=NULL;
        size=0;
    }
    bool EnQueue(int data)
    {
        if(rear==NULL)
        {
            front=rear=new Node(data);
        }else
        {
            rear->link=new Node(data);
            rear=rear->link;
        }
        size++;
        return true;
    }
    int IsEmpty()
    {
        if(size==0)
        {
            return 1;
        }else
        {
            return 0;
        }
    }
    void show()
    {
        Node *p = front;
        if(p == NULL){
            cout  << "空";
        }
        else
            for(p;p!=rear->link;p = p->link)
            {
                cout << p->data;
            }
    }
    void  Link(LinkQueue& start)
    {
        if(rear==NULL)
        {
            front=start.front;
            rear=start.rear;
            size=start.size;
        }
        else
        {
            rear->link=start.front;
            rear=start.rear;
            size+=start.size;
        }
    }
};
int main()
{
    LinkQueue a[10];
    int i;
    cin>>i;
    while(i>=0&&i<=9)
    {
        a[i].EnQueue(i);
        cin>>i;
    }
    for(int n=0;n<=9;n++)
    {
        cout<<"第"<<n<<"个队列:";
        a[n].show();
        cout<<endl;
    }
    for(int j=1;j<=9;j++)
    {
        if(!a[j].IsEmpty())
            a[0].Link(a[j]);
    }
    cout<<"连接后的队列为:"<<endl;
    a[0].show();
    return 0;
}

15.环形队列(TAG)

#include <iostream>
using namespace std;

class CircleArray
{
private:
    int maxSize; // 数组最大容量
    int front;   // 队列头部,指向第一个元素,初始值为0
    int rear;    // 队列尾部,指向最后一个元素的下一位(即空值),初始值为0
    int tag;     //区分满or空
    int *arr;    // 定义数组,模拟环形队列

public:
    CircleArray(int maxSize)
    {
        this->maxSize = maxSize;
        arr = (int *)new int[maxSize]; // 初始化数组长度
        front = 0;
        rear = 0;
        tag = 0;
    }

    // 判断队列是否已满
    bool isFull()
    {
        return rear == front && tag == 1;
    }

    // 判断队列是否为空
    bool isEmpty()
    {
        return rear == front && tag == 0;
    }

    // 添加数据到队伍,rear后移一位(取模)
    void addValue(int n)
    {
        if (isFull())
        {
            cout << "队列已满,无法添加数据" << endl;
        }
        else
        {
            arr[rear] = n;
            rear = (rear + 1) % maxSize;
            tag = 1;
        }
    }

    // 获取队列的数据,front后移一位
    int getValue()
    {
        if (isEmpty())
        {
            cout << "队列为空,无数据" << endl;
            return -1;
        }
        else
        {
            int value = arr[front];
            front = (front + 1) % maxSize;
            tag=0;
            return value;
        }
    }

    // 显示队列的所有数据
    void showValue()
    {
        if (isEmpty())
        {
            cout << "队列为空,没有数据" << endl;
        }
        else
        {
            for (int i = front; i < front + size(); i++)
            {
                cout << "arr[" << i % maxSize << "]=" << arr[i % maxSize];
            }
        }
    }

    // 求出当前队列有效数据的个数
    int size()
    {
        if(isFull()) return maxSize;
        return (maxSize+rear-front)%maxSize;
    }

    // 显示队列的头数据, 注意不是取出数据
    int headValue()
    {
        if (isEmpty())
        {
            cout << "No data" << endl;
            return -1;
        }
        return arr[front];
    }
};

int main()
{
    CircleArray arr(10);

    for (int i = 0; i < 11; i++)
        arr.addValue(i);
    cout<<"队列长度="<<arr.size()<<endl;
    arr.showValue();cout<<endl;
    cout<<"弹出队首元素="<<arr.getValue()<<endl;
    cout<<"队列长度="<<arr.size()<<endl;
    arr.showValue();cout<<endl;
    arr.addValue(999);
    arr.showValue();
    return 0;
}

17.Strcmp函数的实现

#include <iostream>
#include <cstring>
using namespace std;

int Strcmp(const string & s,const string & t)
{
    int i=0;
    while(i<=s.size() && i<=t.size())
        if(s[i]==t[i]) i++;
        else return s[i]<t[i]?(-1):(1);
    return 0;
}

int main()
{
    string str1;
    string str2;
    cin>>str1;
    cin>>str2;
    cout<<Strcmp(str1,str2)<<endl;
    return 0;
}

18.查找字符串最后一次出现的位置(解决方法:反向KMP)

#include <cassert>
#include <iostream>

using namespace std;

/*
TODO:1.7-b.    计算字符串p的特征向量的算法,返回特征向量的数组。
 */
int* next(string P)
{
    int m=P.size();     //字符串的长度
    assert(m>0);        //字符串>0?
    int *N=new int[m];  //开辟一些空间存放特征数组
    assert(N!=0);       //确保开辟成功
    N[m-1]=0;           //最后一个字符的特征值为零
    for(int j=m-2;j>=0;j--) //从倒数第二个字符开始计算特征值
    {
        int k=N[j+1];
        while(k>0 && P[j]!=P[m-k-1])
            k=N[m-k];
        if(P[j]==P[m-k-1])
            N[j]=k+1;
        else
            N[j]=0;
    }
    return N;
}

/*
/TODO:KMP模式匹配算法,返回子串最后一次出现的位置,若不存在,返回-1
参数说明:T为原始字符串
         P为子串
         N为字符串P的特征向量
返回值说明:通过KMP算法如果查找到子串,则返回子串第一次出现的位置,
否则没有查找到,返回-1
*/
int KMPStrMatching(string T, string P, int* N)
{
    if(T.size()-P.size()<0)
        return -1;
    int i=T.size()-1;
    int j=P.size()-1;
    while(i>=0&&j>=0)
    {
        if(P[j]==T[i])
        {
            if(j==0) break;
            j--;i--;
        }
        else if(j!=P.size()-1)
            j=P.size()-N[j+1]-1;
        else i--;
    }
    if(j==0 && i>=0)
        return i+1;
    else return -1;
}

int main()
{
    string substr; //要查找的字符串
    string str; //原始字符串
    getline(cin, substr);
    getline(cin, str);
    int* N;
    N = next(substr);
    for (int i = 0; i < substr.length(); i++)
        cout << N[i] << " ";
    cout << endl;
    cout << KMPStrMatching(str, substr, N) << endl;
    return 0;
}

还是太久没敲代码了啊

最后修改:2022 年 10 月 18 日
如果觉得我的文章对你有用,请随意赞赏