数据结构:机器翻译(链队列实现)

数据结构:机器翻译

这道题的方法有挺多的,但是题目要求是得用队列的知识,那我们一起来看一下。

数据结构:机器翻译(链队列实现)_第1张图片
数据结构:机器翻译(链队列实现)_第2张图片

因为要有一个队列的范围那就是3,也就是说队列里面的数不会超过3个,一开始我是想用循环队列的,但是我原本的循环列对里面的范围是已经定义好了的,而这里的要求这个范围是可变动的,于是我就觉得用链队列似乎会简单一点,于是就使用了链队列。代码如下。

#include
#include
#include
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int QElemType;
typedef int Status;

//- - - - - 队列的链式存储结构- - - - -
typedef struct QNode
{
    QElemType data;
    struct QNode *next;
} QNode, *QueuePtr;

typedef struct
{
    QueuePtr front; //队头指针
    QueuePtr rear; //队尾指针
} LinkQueue;

//算法3.16 链队的初始化
Status InitQueue(LinkQueue &q)  //构造一个空队列Q
{
    q.front = q.rear = new QNode; //生成新结点作为头结点,队头和队尾指针指向此结点
    q.front->next = NULL; //头结点的指针域置空
    return OK;
}

void DestroyQueue(LinkQueue &q)
{
    /* 销毁队列Q(无论空否均可) */
    for(QueuePtr p = q.front, q; p; )
    {
        q = p->next;
        delete p;
        p = q;
    }
}


int QueueLength(LinkQueue q)//判断队列的长度
{
    int length = 0;
    QNode *p = q.front->next;
    while(p!=NULL)
    {
        length++;
        p = p->next;
    }
    return length;
}


//算法3.17 链队的入队
Status EnQueue(LinkQueue &q, QElemType e)  //插入元素e为Q的新的队尾元素
{
    QNode *p;
    p = new QNode;
    p->data = e;
    p->next = NULL;
    q.rear->next = p;
    q.rear = p;
    return OK;
}

//算法3.18 链队的出队
Status DeQueue(LinkQueue &q)  //删除Q的队头元素,用e返回其值
{
    QNode *p;
    if(q.front == q.rear)
        return ERROR;
    else
    {
        p = q.front->next;
        //e = p->data;
        q.front->next = p->next;
    }
    if(q.rear == p)
        q.rear = q.front;
    delete p;
    return OK;
}

void PrintQueue(LinkQueue q)
{
    QueuePtr p;
    for(p = q.front->next; p; p = p->next)
    {

        cout << p->data;
        if(p->next != NULL)
            cout << ' ';
    }
    cout << endl;
}
int main()
{
    int fw,gs,t,i;
    int sum = 0,n = 0;
    LinkQueue q;
    QueuePtr p;
    InitQueue(q);
    cin>>fw>>gs;
    for(i = 0; i < gs; i++)
    {
        n = 0;
        cin>>t;
        if(QueueLength(q) == 0)
            {
                EnQueue(q,t);
                sum++;
            }
       p = q.front->next;//用来找到队列的头,然后方便进行遍历
       
       while(p)//用来判断队列内是否已经含有输入的数,也就是题目里面所说的,在内存寻找单词,如果有就不用进行其他操作,如果没有则把该数输入队列中并且对sum++
       {
           if(p->data == t)
           n = 1;
           p = p->next;
       }
       if(n == 0)
       {
           EnQueue(q,t);
           sum++;
       }
       
       if(QueueLength(q)>fw)//这个就是用来保证当队列内的数超过3时就对最开始的数进行删除以此确保队列数不超过3
       DeQueue(q);
       
       //PrintQueue(q);这个是我用来检验对列内的值是否与题目要求的一致
    }
    cout<<sum;
    DestroyQueue(q);
    return 0;
}

输出结果
数据结构:机器翻译(链队列实现)_第3张图片
验证时的输出如下
数据结构:机器翻译(链队列实现)_第4张图片

至于链队怎么实现的我也就不具体讲了,其它部分要注意的我也在代码里面有进行注释,希望能帮到大家。

你可能感兴趣的:(数据结构)