算法实验设计抽到的几道题,运气很好,抽到的题很简答,所以两周的算法实验一天就写完了,Qt5可视化也就写了一天,相当于放了两周假。。。。23333333333
【注:开发环境均为Qt5 + c++,下面仅提供算法实现的核心代码,附加功能请自行添加】
一,报数问题 【循环队列】
【课题内容】 设有 N个人站成一排,从左到右的编号分别是 1-N,现从左到右报数“ 1,2,1, 2”,数到 1的人出列,数到 2的人站在队伍的最右端。报数过程反复进行,直到 N个 人都出列为止。要求给出他们的出列顺序。
```cpp
定义类:
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow{
typedef struct // 循环队列结构体定义
{
int front;
int rear;
ElemType * element;
} Queue;
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void create (Queue * Q,int mSize) //创建一个能够容纳mSize个单元的空队列
{
Q->element=(ElemType*)malloc(sizeof(ElemType)*mSize);
Q->front=0;
Q->rear=0;
}
BOOL Front(Queue Q,ElemType *x,int mSize) //获取队头元素,通过x返回
{
if(Q.rear == Q.front)
{
return FALSE;
}
*x=Q.element[Q.front];
return TRUE;
}
void EnQueue(Queue *Q,ElemType x,int mSize) //在队列后面的队尾插入元素x
{
Q->element[Q->rear] =x ;
Q->rear=(Q->rear+1)%mSize;
}
void DeQueue(Queue *Q,int mSize) //从队列中删除队头元素
{
if(Q->front == Q->rear)
{
}
Q->front=(Q->front+1)%mSize;
}
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::MainWindow *ui;
QLineEdit *lineinput;
QPushButton *pushButton;
QTextEdit *lineoutput;
};
主要代码:
void MainWindow::on_pushButton_clicked()
{
QString str = ui->lineinput->text();
int num = str.toInt();
Queue Q;
int mSize;
int FLAG =1;
int pout = 0;
int nin =0;
QString out;
mSize = num +1 ;
create (&Q,mSize);
int i;
for(i=0;i<num;i++) //生成 1到mSize的队伍
{
Q.element[Q.rear] =i+1 ;
Q.rear=(Q.rear+1)%mSize;
}
while(Q.front != Q.rear)
{
if(FLAG%2 ==1) //报数为1的人出列
{
Front(Q,&pout,mSize);
QString out = QString::number(pout);
ui->lineoutput->append(out);
DeQueue(&Q