#include <stdio.h>
#include <cstring>
#define MaxSize 100
typedef int ElemType;
typedef struct
{
char name[20];
}Name;
typedef struct{
Name data[MaxSize];
int front; //对头指针
int rear; //队尾指针
}SeqQueue;
typedef struct SqStack{
int data[MaxSize];
int top;
}SqStack;
//初始化栈
void InitStack(SqStack &s){
s.top=-1;
}
//判断栈是否为空
bool Empty(SqStack s){
if(s.top==-1){
return true;
} else return false;
}
//入栈
void Push(SqStack &s,int x){
if(s.top==MaxSize-1){
printf("栈满");
return;
}
s.data[++s.top]=x;
}
void Push_char(SqStack &s,char x){
if(s.top==MaxSize-1){
printf("栈满");
return;
}
s.data[++s.top]=x;
}
//出栈
void Pop(SqStack &s,int &x){
if(s.top==-1){
printf("栈空");
return;
}
x=s.data[s.top--];
}
//遍历栈
void PrintStack(SqStack s){
while (s.top!=-1){
printf("%d",s.data[s.top]);
s.top--;
}
printf("\n");
return;
}
int PrintStack_char(SqStack s,char r){
while (s.top!=-1){
if(r==s.data[s.top])
{s.data[s.top]='q'; //如果存在这个括号。(,给(赋值成q,防止后面(3+2)/4)的情况
return 1;}
s.top--;
}
return 0;
}
//销毁栈
//销毁栈
void DestroyStack(SqStack &S){
S.top = -1;
}
//初始化队列
void InitQueue(SeqQueue &q){
q.front=q.rear=0;
}
//入队
int EnQueue(SeqQueue* Q, char *e){
if((Q->rear+1)%MaxSize== Q->front) return -1;//头指针大于尾指针,即进入下一轮(因为循环链表的问题导致的错误)
strcpy(Q->data[Q->rear].name,e); //用头指针返回e值
Q->rear=(Q->rear+1)%MaxSize; //头指针向前一位
return 1;
}
//出队
int DeQueue (SeqQueue *Q,char *e){
//队列不空则删除Q头元素并用e返回,否则错误
if(Q->front == Q->rear) return -1;
strcpy(e , Q->data[Q->front].name);
Q->front = (Q->front+1)%MaxSize;
return 1;
}
//获取队列中元素个数
int QueueNum(SeqQueue* q){
return (q->rear-q->front+MaxSize)%MaxSize;
}
int QueueEmpty(SeqQueue * q) //判断队列是否为空
{
return q->front == NULL; //为空,返回1
}
int menu(int &q){
int s;
printf("输入一个十进制数:");
scanf("%d", &q);
printf("请选择:1.转二进制 2转八进制 3.转十六进制 4.从新输入一个十进制数 0.退出\n");
scanf("%d", &s);
if (s == 4) {
printf("请从新输入");
scanf("%d", &q);
printf("请选择:1.转二进制 2转八进制 3.转十六进制 4.从新输入一个十进制数 0.退出\n");
scanf("%d", &s);
return s;
} else if (s == 0)
return 0;
else
return s;
}
void Pipei(SqStack &L) {
char s[20];
int t=1;
printf("请输入算式表达式:");
scanf("%s",&s);
for (int i = 0; i < strlen(s); i++) {
if (s[i]=='(' || s[i]=='[' ||s[i]=='{')
Push_char(L,s[i]);
if (s[i]==']' || s[i]==')' ||s[i]=='}') {
if (s[i] ==']')
s[i]='[';
if(s[i]==')')
s[i]='(';
if(s[i]=='}')
s[i]='{';
t = PrintStack_char(L, s[i]);
}
if (t==0)
{ printf("不匹配!");
return;}
}
if(t==1)
printf("匹配!");
};
void Two(SqStack &s,int x){
while (x!=0){
Push(s,x%2);
x=x/2;}
PrintStack(s);
}
void Eight(SqStack &s,int x){
while (x!=0){
Push(s,x%8);
x=x/8;}
PrintStack(s);
}
void Sixten(SqStack &s,int x){
while (x!=0){
Push(s,x%16);
x=x/16;}
PrintStack(s);
}
//求最大值函数
int Max(int n1,int n2){
if(n2>n1)
return n2;
else return n1;}
void wuban(){
int n1,v1; //参加舞会的男生和女生的数量
int number;//舞会轮数
int max;//男生,女生数量的最大值
char t[20];//输入名字的时候的中间变量
SeqQueue nan1,nv1;
//初始化队列
InitQueue(nan1);
InitQueue(nv1);
//
printf("请输入参加舞会的男生数量和女生数量\n");
printf("男生数量:");
scanf("%d",&n1);
//printf("\n");
printf("女生数量:");
scanf("%d",&v1);
// printf("\n");
max= Max(n1,v1);
if(max%3==0) number=max/3;
else number=max/3+1;
printf("%d %d",n1,v1);
for (int i = 1; i <=n1 ; i++) {
printf("请输入第%d位男生的名字:\n",i);
scanf("%s",t);
printf("%s",t);
EnQueue(&nan1,t);
}
printf("开始女生");
for (int i = 1; i <=v1 ; i++) {
printf("请输入第%d位女生的名字:\n",i);
scanf("%s",t);
EnQueue(&nv1,t);
}
printf("————开始配对————\n");
for (int i = 1; i <= number; i++) { //开始Nnumber轮的循环
char t1[20],t2[20];//作为出队的中间变量
printf("---开始第%d轮配对---\n",i);
for(int j=1;j<=3;j++){
printf("第%d对:",j);
DeQueue(&nan1,t1);
printf("%s --- ",t1);
DeQueue(&nv1,t2);
printf("%s\n",t2);
EnQueue(&nan1,t1);//出来的继续在后面排队
EnQueue(&nv1,t2);
}
}
}
void yinhang(){
int s;
printf("请属于最后一个顾客的序号");
scanf("%d",&s);
int t[50];
int t1[50];
int k,j;
k=0;
j=0;
for(int i=1;i<=s;i++){
if(i%2==0) {
t[k]=i;
k++;
}
else{
t1[j]=i;
j++;
}}
int q,w;
q=0;
w=0;
printf("顾客完成的顺序为:\n");
while (t[q]!=0||t[w]!=0){
if(t[q]!=0){
printf("%d\n",t[q]);
q++;}
if(t[q]!=0)
printf("%d\n",t[q]);
q++;
if(t1[w]!=0)
printf("%d\n",t1[w]);
w++;
}
}
int digui(int a){
if (a==1) return a;
else return (a* digui(a-1));
}
int main(){
SqStack L;
int q;
int a1;
InitStack(L);
while (1){
printf("------开始菜单------\n");
printf("请选择模式:1.转进制 2.匹配括号 3.舞会配对 4.银行排队 5.求阶乘\n");
scanf("%d",&a1);
switch (a1) {
case 1:{
int t=menu(q);
DestroyStack(L);
switch (t) {
case 1:
Two(L,q);
break;
case 2:
Eight(L,q);
break;
case 3:
Sixten(L,q);
break;
case 0:
return 0;}
break;}
case 2:{
Pipei(L);
DestroyStack(L);
break;
}
case 3:{
wuban();
break;
}
case 4:
yinhang();
break;
case 5:
int a;
printf("请输入求阶乘的数字:\n");
scanf("%d",&a);
printf("%d\n",digui(a));
break;
}}
}
XCU栈和队列大作业
最新推荐文章于 2024-10-31 19:07:52 发布