队列
给一串加密的数字,规则:首先将第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;
}