排序函数 C++

Sort function C++

排序函数有问题:void SortAge(); 调用打印员工姓名的函数:void print(int d),我只收到我推入 Stack 的第一位员工的姓名... 我没有任何语法错误 感谢时间

#include <iostream>
#include <cstdio>

using namespace std;
struct employee
{
string name;
int age;

};


class Stack
{
employee employeeList[1000];

int pos =-1;

public:

void push(employee e)
{
    pos++;
    employeeList[pos] = e;


}
employee pop(int n)
{
    employee e;
    if(n<= pos && pos >= 0 && n >=0)
    {

        e= employeeList[pos] ;
        for(int j =n; j < pos; j++ )
        {
            employeeList[pos] = employeeList[pos + 1];

        }

        pos--;
    }
    return e;
}

void print(int d)
{
    if(d > pos || d <0 || pos < 0)
    {
        cout<< "Error";

    }
    cout<<employeeList[d].name<<endl;
}

char menu()
{

    char choice;
    cout << "Press 1. to push an employee"<<endl;
    cout << "Press 2. to pop an employee"<<endl;
    cout << "Press 3. to show an employee"<<endl;
    cout << "Press 4. to sort the list by age"<<endl;
    cin>> choice;

    return choice;


}
void SortAge()
{
    int j;
    for(j = 0;j < pos ; j++)
    {
        if(employeeList[j].age >employeeList[j+1].age)
        {
            employee e;
            e = employeeList[j];
            employeeList[j+1] = employeeList[j];
            employeeList[j] = e;
            j = 0;
        } continue;
    }

}


 };

 int main()
 {
 Stack s;

int j;
for(j=0;j<1000;j++)
{
    char input = s.menu();
    switch(input)
    {
    case '1' :
        {
            employee e;
            cout<<"Enter Name :"<<endl;
            cin>>e.name;
            cout<<"Enter Age :"<<endl;
            cin>>e.age;
            s.push(e);
        }
        break;

        case '2' :
            {
                int n;
                cout<<"Enter at witch position you want to delete employee:"               <<endl;
                cin>>n;
                s.pop(n);
            }
            break;

        case '3' :
            {
                int n;
                cout<<"Enter the position of the employee you want to visualize"<<endl;
                cin>>n;
                s.print(n);
            }
            break;
        case '4' :
            {
                s.SortAge();
            }
            break;
    }

}
return 0;

}

您可以使用冒泡排序。于是改排序功能-

    void SortAge()
    {
        int i,j;
        for(i=0; i<=pos ;i++)
        {
            for(j = i+1 ; j <= pos ; j++)
            {
                if(employeeList[i].age >employeeList[j].age)
                {
                    employee e;
                    e = employeeList[j];
                    employeeList[j] = employeeList[i];
                    employeeList[i] = e;
                }
            }
        }

    }

你的pop()函数也有错误:(

    employee pop(int n)
    {
        employee e;
        if(n<= pos && pos >= 0 && n >=0)
        {

            e= employeeList[pos] ;
            for(int j =n; j < pos; j++ )
            {
                employeeList[j] = employeeList[j + 1];
                // Changed
            }
            pos--;
        }
        return e;
    }

您的排序算法不正确。

除此之外,既然您使用的是 C++,为什么不直接使用 the built-in sorting function

#include <algorithm>
...
void SortAge() {
    std::sort(employeeList, employeeList + pos + 1, [](employee a, employee b){return a.age < b.age});
}

我同意 Akash Jain 的解决方案。除非对使用内置排序函数有一些限制,否则您应该为您的员工 class.

选择带有自定义比较器(基于谓词)的 std::sort

此外,为什么不使用 std::stack 。这样你就可以使用内置的 pop() 方法来删​​除最顶层的元素。