【问题描述】用于列车编组的铁路转轨网络是一种栈结构,其中,右边作为输入端,左边作为输出端。当右边轨道上的车皮编号顺序为1,2,3,4时,如果执行操作为进栈、进栈、出栈、进栈、进栈、出栈、出栈、出栈,则在左边轨道上的车皮编号顺序为2,4,3,1。编写一个算法,输入n个整数,表示右边轨道上n节车皮的编号,用上述转轨栈对这些车皮重新编排,使得编号为奇数的车皮都排在编号为偶数的车皮的前面,编号为偶数的车皮序列与输入时的序列正好相反。利用顺序栈和顺序队列的实现。
【输入形式】输入n个整数,数值之间空格分隔,以回车结束。
【输出形式】保持数值之间的前后位序,显示的结果为奇数在前偶数在后,偶数输出序列为输入序列的逆置,数值之间空格分隔。
【样例输入】1 2 3 4 5
【样例输出】1 3 5 4 2
【样例输入】4 1 3 2
【样例输出】1 3 2 4
【样例说明】
【评分标准】
出栈:判断栈空
进栈:判断栈满
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
typedef struct stack
{
int *top;
int *base;
int stacksize;
}SqStack;
void InitStack(SqStack &s)
{
s.base = s.top = new int[100]; //指针开创空间 需要用new int[100]
if (!s.base)
exit(1);
s.stacksize = 100; //整形变量 直接赋值开创
}
int Empty(SqStack &s)
{
if (s.base == s.top)
return 1;
else
return 0;
}
void Push(SqStack &s,int n) //进栈考虑栈满情况
{
if (s.top - s.base == s.stacksize)
exit(1);
*s.top = n; //先赋值 再移动
s.top++;
}
int Pop(SqStack &s)
{
int t;
if(s.base==s.top)
exit(1);
else
{
s.top--; //先移动 再赋值
t = *s.top;
return t;
}
}
int main()
{
SqStack s;
InitStack(s);
int n;
char ch = 0;
while (ch != '\n')
{
cin >> n;
ch = getchar();
if (n % 2 == 0) //n为偶数 先进后出
{
Push(s, n);
}
else
cout << n << " "; //n为奇数 直接打印
}
while (Empty(s) == 0)
{
int t;
t = Pop(s); //栈内的偶数进行打印
cout << t << " ";
}
return 0;
}