问题描述
给定一个序列 A,请你将它升序排序。
输入格式
第一行一个正整数 n,表示序列长度。
第二行 n 个用空格隔开的非负整数,描述这个序列。
输出格式
n 行,每行一个非负整数,表示排序后的序列。
样例输入
4
1 3 2 10
样例输出
1
2
3
10
数据范围
保证 n<=1000,保证序列中的数不超过 32767
首先创建栈的模板类
template <class T>
class Stack {
private:
int top;//记录到顶时有几个元素在栈里面,同时也相当于数组最后一个元素的编号
int size;//创建栈时需要size
T* data;//创建指针
public:
//构造函数
Stack(int s) {
top = -1;//相当于一个左边界
size = s;//可以创建理想大小的栈
data = new T[size];//类似于数组的创建
}
//析构函数
~Stack(){
delete[] data;
}
//将新元素推入栈中
void push(T value) {
if (top == size -1){
return;
}
top++;
data[top] = value;
}
//栈顶元素出栈
T pop(){
if (top == -1) {
return 0;
}
T value = data[top];
top--;
return value;
}
//读取栈顶的元素
T peek(){
if (top == -1) {
return 0;
}
return data[top];
}
//判空函数,某些情况很重要
bool isEmpty(){
return (top == -1);
}
};
然后在主函数中排序
int main() {
int n = 0;
cin >> n;
int k = 0;
int j = 0;
int i = 0;
Stack<int> num = Stack<int>(n);
Stack<int> temp = Stack<int>(n);
//最后是升序排序,根据栈的特点要在栈中降序排序
for (i = 0; i < n; i++){
cin >> k;
if (i == 0) {//先让第一个元素进栈
num.push(k);
}
else {
if (k <= num.peek()){//如果输入的数比栈顶的数小就直接入栈
num.push(k);
}
else {//输入数值比栈顶大
while ((k > num.peek())&&(num.isEmpty() == false)){//注意在栈中进行降序排序时要考虑栈的左边界,一定不要超过栈的左边界,要及时判空
temp.push(num.pop());//将比输入数值小的数都推入缓冲栈中
}
num.push(k);
while (temp.isEmpty() == false){
num.push(temp.pop());//再将这些数推回去,这样还能保持原来的顺序
}
}
}
}
for (i = 0; i < n; i++){
cout << num.pop() << endl;
}
return 0;
}
欢迎批评指正!