题目
商品货架可以看成一个栈,栈顶商品的生产日期最早,栈底商品的生产日期最近。上货时,需要进行倒货架,以保证生产日期较近的商品在较下的位置。用栈和队列作为周转,实现上述管理。
输入:栈的初始大小,及栈内的商品生产日期,上货的商品数量,及每个商品的生产日期
输出:栈的大小,及栈内的商品生产日期
样例输入:
5
20220101
20220315
20220409
20220529
20220601
3
20220515
20220412
20220617
样例输出:
8
20220101
20220315
20220409
20220412
20220515
20220529
20220601
20220617
我的思路
题目要求同时使用栈和队列来完成,在最后阶段所有商品都是有序存在栈里,因此可以把待上架的商品信息存在一个队列中,然后出队列与栈顶商品信息进行比较,如果栈顶商品日期更小则出栈,用一个临时数组存储。直到遇见栈顶元素大于待上架的元素或者栈为空,此时再把元素入栈,然后把临时数组中的元素都入栈。
代码实现
#include<iostream>
using namespace std;
typedef struct stack
{
char** top, ** bot;
}Stack;
typedef struct queue
{
char* data[100];
int front = 0, rear = 0;
}queue;
void InitStack(Stack& s)
{
s.top = s.bot = new char* [100];
s.top--;
}
void Push(Stack& s, char* str)
{
*(++s.top) = str;
}
void Pop(Stack& s, char*& str)
{
str = *(s.top--);
}
void En(queue& q, char* s)
{
q.data[q.rear++] = s;
}
void De(queue& q, char*& s)
{
s = q.data[q.front++];
}
bool dayu(char* s1, char* s2);
int main()
{
Stack s;
InitStack(s);
queue q;
char data[100][9];
char data2[100][9];
int n;
cin >> n;
for (int j = 0; j < n; j++)
{
for (int k = 0; k < 8; k++)
cin >> data[j][k];
data[j][8] = '\0';
}
for (int j = n - 1; j >= 0; j--)
{
Push(s, data[j]);
}
cin >> n;
for (int i = 0; i < n; i++)
{
for (int k = 0; k < 8; k++)
cin >> data2[i][k];
data2[i][8] = '\0';
En(q, data2[i]);
}
int i = q.rear - q.front;
while (i>0)
{
char* p = NULL, * r = NULL;
De(q, p);
r = *(s.top - 1);
char* ptr[100];
int counst = 0;
while (dayu(p, r))
{
Pop(s, ptr[counst++]);
if (s.top < s.bot)
break;
r = *(s.top);
}
counst -= 1;
Push(s, p);
while (counst >= 0)
{
Push(s, ptr[counst--]);
}
i--;
}
cout << endl;
while (s.top != s.bot-1)
{
char* k = NULL;
Pop(s, k);
for (int i = 0; i < 8; i++)
{
cout << k[i];
}
cout << endl;
}
return 0;
}
bool dayu(char* s1, char* s2)
{
for (int i = 0; i < 8; i++)
{
if (s1[i] > s2[i])
return true;
else if (s1[i] < s2[i])
return false;
else
continue;
}
return false;
}