栈和列表:进制转换,括号匹配,舞伴问题
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; } }

 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号