数据结构作业:十进制转换+括号匹配+舞伴问题
是项目二的实验报告,关于栈和队列的基本操作
但是我真的不太想写....所以能用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!