栈和列表:进制转换,括号匹配,舞伴问题

1.进制转换:顺序栈,只有2和8,其实16进制也一样,只需要进行对应的转换就可以了(10->a)

#include<bits/stdc++.h>
using namespace std;
#define OK 1
#define ERROR -1
#define MAXSIZE 1000
typedef struct 
{
    int *base;
    int *top;
    int stacksize;
}Sqstack;
int Intstack(Sqstack &s)
{
    s.base=new int[MAXSIZE];
    if(!s.base) exit(OVERFLOW);
    s.top=s.base;
    s.stacksize=MAXSIZE;
    return OK;
}
int Push(Sqstack &s,int e)
{
    if(s.top-s.base==s.stacksize) return ERROR;
    *s.top++=e;
    return OK;
}
int Pop(Sqstack &s)
{
    int e;
    if(s.top==s.base) return ERROR;
    e=*--s.top;
    cout<<e;
    return OK;
}
int Stackint(Sqstack s)
{
     if(s.top==s.base)
     return 1;
     return 0;
}
int main()
{
    Sqstack s;
    Intstack(s);
    int a,n;
    cout<<"请输入十进制数:"<<endl;    
    cin>>a;
    cout<<"请输入要转换的进制数(2/8):"<<endl;
    cin>>n;
    while(a)
    {
        int b;
        b=a%n;
        Push(s,b);
        a=a/n;
    }
    cout<<n<<"进制数为:"<<endl;
    while(!Stackint(s))
    {
        Pop(s);
    }
}

 

 

 2.括号匹配:顺序栈

#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 1000
#define OK 1
#define ERROR -1
typedef struct 
{
    int *base;
    int *top;
    int stacksize;
}Sqstack;
int Intstack(Sqstack &s)
{
    s.base=new int[MAXSIZE];
    if(!s.base) return ERROR;
    s.top=s.base;
    s.stacksize=MAXSIZE;
    return OK;
}
int Push(Sqstack &s,char e)
{
    if(s.top-s.base==s.stacksize) return ERROR;
    *s.top++=e;
    return OK;
}
int Pop(Sqstack &s)
{
    char e;
    if(s.top==s.base) return ERROR;
    e=*--s.top;
    return OK;
}
int Stackint(Sqstack &s)
{
    if(s.base==s.top)
    return 1;
    return 0;
}
int Gettop(Sqstack &s)
{
    if(s.top!=s.base)
    return *(s.top-1);
}
int main()
{
    Sqstack s;
    Intstack(s);
    int flag=1;
    char ch;
    cin>>ch;
    while(ch!='#'&&flag)
    {
        switch(ch)
        {
            case '(':
            case '[':
                Push(s,ch);
                break;
            case ')':
                if(!Stackint(s)&&Gettop(s)=='(')
                Pop(s);
                else 
                flag=0;
                break;
            case ']':
                if(!Stackint(s)&&Gettop(s)=='[')
                Pop(s);
                else flag=0;
                break;
        }
        cin>>ch;
    }
    if(Stackint(s)&&flag)
    cout<<"匹配成功"<<endl;
    else
    cout<<"匹配失败"<<endl;
}

 

 

 

 

 

 3.舞伴问题

//舞伴问题,循环队列 
#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 100
#define OK 1
#define ERROR -1
typedef struct
{
    string name;
    char sex;
}person;
person dancer[MAXSIZE];
person p;
typedef struct 
{  
    person *base;
    int front;
    int rear;
}Sqqueue;
//初始化 
int Initqueue(Sqqueue &Q)
{
    //base的含义:存储空间的基地址,可以通俗的理解为数组,要有下标 
    Q.base=new person[MAXSIZE];
    if(!Q.base) return ERROR;
    //front和rear都是下标,初始化是让下标都为0 
    Q.front=Q.rear=0;
    return OK;
}
//判断是否为空
int Emptyqueue(Sqqueue &Q)
{
    if(Q.rear==Q.front)
    return 1;
    else return 0;
 } 
//入列 
int Getqueue(Sqqueue &Q,person e)
{
    if((Q.rear+1)%MAXSIZE==Q.front)
    return ERROR;    
    Q.base[Q.rear]=e;
    //为什么要模除MAXSIZ:如果MXAXSIZE=6,rear为第六个元素 
    //且队列没满,就要给第六项值,并把rear变为第一项的下标
    //这就是循环队列的特点 
    Q.rear=(Q.rear+1)%MAXSIZE;
    return OK;
}
//出列 
int Dequeue(Sqqueue &Q,person &p)
{
    if(Q.rear==Q.front)
    return ERROR;
    p=Q.base[Q.front];     //相当于:Q.rear[i]
    Q.front=(Q.front+1)%MAXSIZE;//移动位置也是移动下标 
    return OK;
}
//取队头元素 
person Gethead(Sqqueue &Q)
{
    if(Q.front!=Q.rear)
    //cout<<Q.base[Q.front].name;
    return Q.base[Q.front];
 } 
 //主函数
 int main()
 {    
    int n;
     cout<<"请输入舞者的人数:";
    cin>>n;
    for(int i=0;i<n;i++)
    {
        printf("第%d位舞者:",i+1);
        cout<<"请输入舞者的姓名:";
        cin>>dancer[i].name;
        cout<<"请输入舞者的性别(M/F):";
        cin>>dancer[i].sex;
        cout<<endl;
     }
     Sqqueue Mdancer,Fdancer;
     Initqueue(Mdancer);
     Initqueue(Fdancer);
     for(int i=0;i<n;i++)
     {
         p=dancer[i];
         if(p.sex=='F')
         Getqueue(Fdancer,p);
         if(p.sex=='M')
         Getqueue(Mdancer,p);
     }
     while(!Emptyqueue(Fdancer)&&!Emptyqueue(Mdancer))
     {
         Dequeue(Fdancer,p);
         cout<<"女舞者为:"; 
         cout<<p.name<<endl;
         Dequeue(Mdancer,p);
         cout<<"男舞者为:";
         cout<<p.name<<endl;
     }
     if(!Emptyqueue(Fdancer))
     {
         p=Gethead(Fdancer);
         cout<<"下一次优先匹配的女舞者为:";
         cout<<p.name<<endl; 
     }
     if(!Emptyqueue(Mdancer))
     {
         p=Gethead(Mdancer);
         cout<<"下一次优先匹配的男舞者为:";
         cout<<p.name<<endl; 
     }
  } 

 

posted @ 2022-04-03 18:58  格蕾  阅读(135)  评论(0)    收藏  举报