1.//图邻接矩阵储存
//非递归运用栈和队列实现
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#define ll long long
#define mod 1000000007
#define INF 1e9
using namespace std;
char vertex[100];
int arc[100][100];
int flag[100];
int n,m;
void creat()
{
cout<<"请输入顶点数和边关系数:";
cin>>n>>m;
cout<<"请依次输入所有顶点:\n";
for(int i=0;i<n;i++)cin>>vertex[i];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)arc[i][j]=0;
else arc[i][j]=-1;
}
}
cout<<"请依次输入所有边关系:\n";
for(int i=0;i<m;i++)
{
char c1,c2;cin>>c1>>c2;
int f1=-1,f2=-1;
for(int j=0;j<n;j++)
{
if(vertex[j]==c1)f1=j;
if(vertex[j]==c2)f2=j;
}
arc[f1][f2]=arc[f2][f1]=1;
}
}
void dfs()
{
memset(flag,0,sizeof(flag));
cout<<"dfs:";
stack<char>s;
s.push(vertex[0]);
cout<<vertex[0]<<" ";
while(!s.empty())
{
char c=s.top();
int f1=-1;
for(int i=0;i<n;i++)
{
if(vertex[i]==c)
{
f1=i,flag[i]=1;
break;
}
}
int f=0;
for(int i=0;i<n;i++)
{
if(arc[f1][i]==1&&flag[i]==0)
{
s.push(vertex[i]);
cout<<vertex[i]<<" ";
flag[i]=1;
f=1;
break;
}
}
if(f==0)s.pop();
}
cout<<"\n";
}
void bfs()
{
memset(flag,0,sizeof(flag));
cout<<"bfs:";
queue<char>q;
q.push(vertex[0]);
cout<<vertex[0]<<" ";
while(!q.empty())
{
char c=q.front();
q.pop();
int f1=-1;
for(int i=0;i<n;i++)
{
if(vertex[i]==c)
{
f1=i,flag[i]=1;
break;
}
}
int f=0;
for(int i=0;i<n;i++)
{
if(arc[f1][i]==1&&flag[i]==0)
{
q.push(vertex[i]);
cout<<vertex[i]<<" ";
flag[i]=1;
f=1;
}
}
}
cout<<"\n";
}
int main()
{
creat();
dfs();
bfs();
return 0;
}
2.图的邻接表储存非递归实现DFS;
typedef struct edgenode
{
int adjvex;
struct edgenode *next;
}edgenode,*edgetree;
typedef struct vextexnode
{
char data;
edgenode *firstedge;
}vextexnode,*vextextree;
int n,m;
vextexnode adjlist[100];
int flag[100];
void createadjlist()
{
cout<<"请输入顶点数和边关系数:";
cin>>n>>m;
cout<<"请依次输入所有顶点:\n";
for(int i=0;i<n;i++)
{
char c;cin>>c;
adjlist[i].data=c;
adjlist[i].firstedge=NULL;
}
cout<<"请依次输入所有边关系:\n";
for(int i=0;i<m;i++)
{
char c1,c2;cin>>c1>>c2;
int f1=-1,f2=-1;
for(int i=0;i<n;i++)
{
if(adjlist[i].data==c1)f1=i;
if(adjlist[i].data==c2)f2=i;
}
edgetree p1=new edgenode;
edgetree p2=new edgenode;
p1->adjvex=f2;
p1->next=NULL;
p2->adjvex=f1;
p2->next=NULL;
if(adjlist[f1].firstedge==NULL)
{
adjlist[f1].firstedge=p1;
}
else
{
edgetree p=adjlist[f1].firstedge;
while(p->next)p=p->next;
p->next=p1;
}
if(adjlist[f2].firstedge==NULL)
{
adjlist[f2].firstedge=p2;
}
else
{
edgetree p=adjlist[f2].firstedge;
while(p->next)p=p->next;
p->next=p2;
}
}
}
void dfs()
{
cout<<"dfs:";
stack<vextexnode>s;
s.push(adjlist[0]);
cout<<adjlist[0].data<<" ";
flag[0]=1;
while(!s.empty())
{
edgetree p=s.top().firstedge;
int f=0;
for(;p!=NULL;p=p->next)
{
if(flag[p->adjvex]==0)
{
flag[p->adjvex]=1;
cout<<adjlist[p->adjvex].data<<" ";
s.push(adjlist[p->adjvex]);
f=1;
break;
}
}
if(f==0)s.pop();
}
cout<<"\n";
}
int main()
{
createadjlist();
memset(flag,0,sizeof(flag));
dfs();
return 0;
}