第二章 栈、队列、链表

队列

给一串加密的数字,规则:首先将第1个数删除,紧接着将第2个数放到这串数的末尾,再将第3个数删除并将第4个数放到这串数的末尾,再将第5个数删除……直到剩下最后一个数,将最后一个数也删除。按照删除的顺序,把删除的数连在一起就是结果。
数组实现
#include<iostream>
#include<vector>
#include<iterator>
#include<algorithm>

using namespace std;

int main(void)
{
    vector<int> input_data = { 6, 3, 1, 7, 5, 8, 9, 2, 4 };

    //输出原数据
    cout << "原始:";
    ostream_iterator<int> o_iter(cout, " ");
    copy(input_data.begin(), input_data.end(), o_iter);
    cout << endl;

    //数组实现
    cout << "输出:";
    int * queue = new int[input_data.size() * 2];  //删除一个,保留一个,说明不会超过原长度的两倍
    copy(input_data.begin(), input_data.end(), queue);
    int head = 0;  //队头
    int tail = input_data.size();  //队尾(尾后元素)

    while (head < tail)
    {
        cout << queue[head] << ' ';
        ++head;

        if (head == tail)  //最后一个数
            break;

        queue[tail++] = queue[head++];
    }
    cout << endl;

    delete [] queue;

    return 0;
}
C++ queue适配器实现
#include<iostream>
#include<vector>
#include<iterator>
#include<algorithm>
#include<queue>

using namespace std;

int main(void)
{
    vector<int> input_data = { 6, 3, 1, 7, 5, 8, 9, 2, 4 };

    //输出原数据
    cout << "原始:";
    ostream_iterator<int> o_iter(cout, " ");
    copy(input_data.begin(), input_data.end(), o_iter);
    cout << endl;

    //queue适配器实现
    cout << "输出:";
    queue<int> q;
    for (auto data : input_data)
        q.push(data);

    while (!q.empty())
    {
        cout << q.front() << ' ';
        q.pop();

        if (q.empty())  //最后一个数
            break;

        q.push(q.front());
        q.pop();
    }
    cout << endl;

    return 0;
}

匹配回文
数组实现
#include<iostream>
#include<cstring>

using namespace std;

int main(void)
{
    char input_data[] = "ahaha";
    int len = strlen(input_data);  //字符串长度
    int mid = len / 2;  //字符串中点
    char * stack = new char[mid];

    int top = 0;  //栈顶

    for (int i = 0; i < mid; ++i)
    {
        stack[top++] = input_data[i];  //前半部分依次入栈
    }

    if (len % 2)
        ++mid;  //如果长度是奇数,就加1

    for (int i = mid; i < len; ++i)
    {
        cout << input_data[i] << endl;
        if (input_data[i] != stack[--top])  //前后不匹配不是回文
            break;
    }

    cout << input_data;
    if (top == 0)
        cout << "是回文" << endl;
    else
        cout << "不是回文" << endl;

    return 0;
}
C++ stack适配器实现
#include<iostream>
#include<string>
#include<stack>

using namespace std;

int main(void)
{
    string input_data("ahaha");

    stack<char> s;
    for (int i = 0; i < input_data.size() / 2; ++i)
        s.push(input_data[i]);

    for (int i = (input_data.size() % 2 ? input_data.size() / 2 + 1 : input_data.size() / 2);
        i < input_data.size(); ++i)
    {
        if (s.top() != input_data[i])
            break;
        s.pop();
    }

    cout << input_data;
    if (s.empty())
        cout << "是回文" << endl;
    else
        cout << "不是回文" << endl;

    return 0;
}
堆栈最早由Alan M.Turing于1946年提出,当时是为了解决子程序的调用和返回。

图灵的书:《艾伦·图灵传:如谜的秘密》、《图灵的秘密》

链表

建立链表、插入链表、遍历链表
自定义结构实现
#include<iostream>
#include<vector>

using namespace std;

struct node
{
    int data;
    node * next;
};

int main(void)
{
    vector<int> input_data = { 2, 3, 5, 8, 9, 10, 18, 26, 32 };
    struct node * head = nullptr;  //头指针
    struct node * help = nullptr;  //辅助指针

    for (auto data : input_data)
    {
        node * temp_node = new node;
        temp_node->data = data;
        temp_node->next = nullptr;
        if (head)
            help->next = temp_node;
        else
            head = temp_node;
        help = temp_node;
    }

    int insert_data = 6;

    help = head;  //从链表头部开始遍历
    while (help)
    {
        if ((help->next && help->next->data > insert_data) || !help->next)
        {
            node * temp_node = new node;
            temp_node->data = insert_data;
            temp_node->next = help->next;
            help->next = temp_node;
            break;
        }
        help = help->next;
    }

    //遍历输出
    help = head;
    while (help)
    {
        cout << help->data << ' ';
        help = help->next;
    }
    cout << endl;

    return 0;
}
C++ 11 forward_list实现
#include<iostream>
#include<vector>
#include<forward_list>

using namespace std;

int main(void)
{
    vector<int> input_data = { 2, 3, 5, 8, 9, 10, 18, 26, 32 };

    forward_list<int> head;
    auto begin = head.before_begin();  //与尾后对应的前置迭代器
    for (auto data : input_data)
        begin = head.insert_after(begin, data);  //返回插入数据的迭代器

    int insert_data = 6;
    auto pred = head.before_begin();
    auto curr = head.begin();
    while (curr != head.end())
    {
        if (*curr > insert_data)
        {
            head.insert_after(pred, insert_data);
            break;
        }
        ++curr;
        ++pred;
    }
    if (curr == head.end())  //插入尾部
        head.insert_after(pred, insert_data);

    for (auto data : head)
        cout << data << ' ';
    cout << endl;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值