数据结构作业:十进制转换+括号匹配+舞伴问题

是项目二的实验报告,关于栈和队列的基本操作

但是我真的不太想写....所以能用STL为什么不用嘞嘿嘿!(STL大法好!)


 

一、十进制转换为n进制

输入一个十进制数,利用栈操作,将该数转换成n进制数。以十进制整数转换为八进制数为例,在计算过程中,把N与8求余得到的八进制数的各位依次进栈,计算完毕后将栈中的八进制数依次出栈输出。


是一道很简单的题目,只需要对转化为n>10的进制特判就好啦。


 放代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int m,n,e;
 4 char x;
 5 int main()
 6 {
 7     stack<int>s;
 8     cin>>m>>n;
 9     while(m)
10     {
11         e=m%n;
12         if(e<10)
13             x=e+'0';
14         else
15             x=e-10+'a';
16         s.push(x);
17         m/=n;
18     }
19     while(!s.empty())
20     {
21         char t=s.top();
22         s.pop();
23         cout<<t;
24     }
25     return 0;
26 }

 

二、括号匹配

输入一个表达式,表达式中包括三种括号“()”、“[]”和“{}”,判断该表达式的括号是否匹配。检验算法借助一个栈,每当读入一个左括号,则直接入栈,等待相匹配的同类右括号;每当读入一个右括号,若与当前栈顶的左括号类型相同,则二者匹配,将栈顶的左括号出栈,直到表达式扫描完毕。

(实验内容就是这么写的,没有说明如何输出。将出栈的括号输出?将匹配好的括号组输出?还是输出是否可以匹配成功?这里我以输出是否能与栈顶括号匹配为目标。)


题目不难但是我的代码太过冗杂了,有时间再改叭。

如果是左括号则入栈。右括号的情况下,如果栈空则break,如果不为空且和栈顶的左括号匹配则栈顶出栈且继续扫描表达式。

(记得洛谷上好像做过一道入门题跟这个差不多)

放代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char c;
 4 stack<char>s;
 5 int main()
 6 {
 7     while(cin>>c&&c!='@'){
 8         if(c=='(') s.push(c);
 9         if(c=='[') s.push(c);
10         if(c=='{') s.push(c);
11         if(c==')'){
12             if(s.empty()){
13                 char ch='*';
14                 cout<<"NO";
15                 s.push(ch);
16                 break;
17             }
18             else{
19                 char ch=s.top();
20                 s.pop();
21                 if(ch!='('){
22                     cout<<"NO";
23                     s.push(ch);
24                     break;
25                 }
26             }
27         }
28         if(c==']'){
29             if(s.empty()){
30                 char ch='*';
31                 cout<<"NO";
32                 s.push(ch);
33                 break;
34             }
35             else{
36                 char ch=s.top();
37                 s.pop();
38                 if(ch!='['){
39                     cout<<"NO";
40                     s.push(ch);
41                     break;
42                 }
43             }
44         }
45         if(c=='}'){
46             if(s.empty()){
47                 char ch='*';
48                 cout<<"NO";
49                 s.push(ch);
50                 break;
51             }
52             else{
53                 char ch=s.top();
54                 s.pop();
55                 if(ch!='{'){
56                     cout<<"NO";
57                     s.push(ch);
58                     break;
59                 }
60             }
61         }
62     }
63     if(s.empty()) cout<<"YES";
64     return 0;
65 }

 

三、舞伴问题

循环队列的应用——舞伴配对问题:在舞会上,男、女各自排成一队。舞会开始时,依次从男队和女队的队头各出一人配成舞伴。如果两队初始人数不等,则较长的那一队中未配对者等待下一轮舞曲。假设初始男、女人数及性别已经固定,舞会的轮数从键盘输入。试模拟解决上述舞伴配对问题。要求:从屏幕输出每一轮舞伴配对名单,如果在该轮有未配对的,能够从屏幕显示下一轮第一个出场的未配对者的姓名。


为什么STL中没有循环队列!啊!我还要自己写!啊!啊!好长啊!我不喜欢写!啊!

定义一个结构体,包括姓名和性别,将每个结构体作为队列中的数据项。需要两个队列,分为男队和女队。

把SQ->front和SQ->rear看作是下标,所以front和rear是int类型的。

本题的重难点是“配对函数”(当然对我来说还有建队)和判断循环队列的队空、队满、假溢出情况(循环队列的重难点在这儿)。

首先根据性别分别让男女生进队,然后为他们配对。如果某一队先空,则计算另一队还有几人在等待,且输出第一个人为“下一轮第一个出场的未配对者”。


没有什么难度,就是麻烦!(其实是我不太会建队啦...555)

放代码

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 const int QueueSize=100;//最大长度
  4 int n;//舞池中的人数
  5 typedef struct
  6 {
  7     char name[20];//姓名
  8     char sex;//性别
  9 }Person;
 10 Person dancers[100];
 11 typedef struct Squeue
 12 {
 13     Person queue[QueueSize];
 14     int front,rear;
 15 }Queue;
 16 void InitQueue(Queue *SQ)//初始化
 17 {
 18     SQ->front=SQ->rear=0;
 19 }
 20 int QueueEmpty(Queue SQ)//判空函数
 21 {
 22     if(SQ.front==SQ.rear) return -1; 
 23     else return 0;
 24 }
 25 int EnQueue(Queue *SQ,Person e)//入队函数
 26 {
 27     if(SQ->front==(SQ->rear+1)%QueueSize) return 0;
 28     SQ->queue[SQ->rear]=e;
 29     SQ->rear=(SQ->rear+1)%QueueSize;
 30     return 1;
 31 }
 32 int DeQueue(Queue *SQ,Person *e)//出队函数
 33 {
 34     if(SQ->front==SQ->rear) return 0;
 35     else
 36     {
 37         *e=SQ->queue[SQ->front];
 38         SQ->front=(SQ->front+1)%QueueSize;
 39         return 1;
 40     }
 41 }
 42 int GetHead(Queue SQ,Person *e)//取队首元素
 43 {
 44     if(SQ.front==SQ.rear) return 0;
 45     else
 46     {
 47         *e=SQ.queue[SQ.front];
 48         return 1;
 49     }
 50 }
 51 int DancerCount(Queue Q)//循环队列 
 52 {
 53     return (Q.rear-Q.front+QueueSize)%QueueSize;
 54 }
 55 void team(Person *dancers,int num)//配对函数
 56 {
 57     int i;
 58     Person p;
 59     Queue Fdancers,Mdancers;
 60     InitQueue(&Fdancers);
 61     InitQueue(&Mdancers);
 62     for(i=0;i<num;i++)
 63     {
 64         p=dancers[i];
 65         if(p.sex=='f') EnQueue(&Fdancers,p);
 66         else EnQueue(&Mdancers,p);
 67     }
 68     cout<<"成功匹配的舞伴分别是:";
 69     while(!QueueEmpty(Fdancers)&&!QueueEmpty(Mdancers))
 70     {
 71         DeQueue(&Fdancers,&p);
 72         cout<<p.name<<' ';
 73         DeQueue(&Mdancers,&p);
 74         cout<<p.name<<endl;
 75     }
 76     if(!QueueEmpty(Fdancers))
 77     {
 78         cout<<""<<DancerCount(Fdancers)<<"个人正在等待中"<<endl;
 79         GetHead(Fdancers,&p);
 80         cout<<p.name<<"已得到舞伴"<<endl;
 81     }
 82     else if(!QueueEmpty(Mdancers))
 83     {
 84         cout<<""<<DancerCount(Mdancers)<<"个人正在等待中"<<endl;
 85         GetHead(Mdancers,&p);
 86         cout<<p.name<<"已得到舞伴"<<endl;
 87     }
 88 }
 89 int main()
 90 {
 91     ios::sync_with_stdio(false);
 92     cout<<"请输入舞池中的人数:";
 93     cin>>n;
 94     for(register int i=0;i<n;i++)
 95     {
 96         cout<<"姓名:";
 97         cin>>dancers[i].name;
 98         cout<<"性别:";
 99         cin>>dancers[i].sex;
100     }
101     team(dancers,n);
102     return 0;
103 }

呼,还好在零点之前发出来了~

end!

 

posted @ 2022-03-31 23:56  爱吃虾滑  阅读(507)  评论(0编辑  收藏  举报