使用栈实现DFS(非递归DFS)
2016-04-07 12:57
615 查看
图片摘自:点击打开链接
#include <stdlib.h>
#include <stdio.h>
#define N 4 //定义图中点个数
int a
= {{-1,1,1,-1},{1,-1,-1,1},{1,-1,-1,1},{-1,1,1,-1}}; //邻接矩阵,-1无边
int label
= {0}; //标记数组,0未标记
//定义栈及其方法
struct Stack
{
int a[4]; //存入栈元素
int top; //栈顶指针
};
typedef struct Stack Stack;
void addStack(Stack *s, int data) //入栈
{
s->top++;
s->a[s->top] = data;
}
int delStack(Stack *s) //出栈
{
return s->a[s->top--];
}
int getTop(Stack *s) //得到栈顶元素
{
return s->a[s->top];
}
//使用栈的非递归DFS
void dfs(int start)
{
Stack *s = (Stack *)malloc(sizeof(Stack));
s->top = -1;
printf("%d ", start);
label[start] = 1;
addStack(s, start);
while(s->top != -1)
{
int tmp = getTop(s);
int i;
for(i=0; i<4; i++)
{
if(a[tmp][i] == 1 && label[i] == 0)
{
printf("%d ", i);
label[i] = 1;
addStack(s, i);
break; //此处必须有break,否则构不成DFS
}
}
if(i == 4)
delStack(s);
}
free(s);
}
int main()
{
dfs(0);
return 0;
}
#include <stdlib.h>
#include <stdio.h>
#define N 4 //定义图中点个数
int a
= {{-1,1,1,-1},{1,-1,-1,1},{1,-1,-1,1},{-1,1,1,-1}}; //邻接矩阵,-1无边
int label
= {0}; //标记数组,0未标记
//定义栈及其方法
struct Stack
{
int a[4]; //存入栈元素
int top; //栈顶指针
};
typedef struct Stack Stack;
void addStack(Stack *s, int data) //入栈
{
s->top++;
s->a[s->top] = data;
}
int delStack(Stack *s) //出栈
{
return s->a[s->top--];
}
int getTop(Stack *s) //得到栈顶元素
{
return s->a[s->top];
}
//使用栈的非递归DFS
void dfs(int start)
{
Stack *s = (Stack *)malloc(sizeof(Stack));
s->top = -1;
printf("%d ", start);
label[start] = 1;
addStack(s, start);
while(s->top != -1)
{
int tmp = getTop(s);
int i;
for(i=0; i<4; i++)
{
if(a[tmp][i] == 1 && label[i] == 0)
{
printf("%d ", i);
label[i] = 1;
addStack(s, i);
break; //此处必须有break,否则构不成DFS
}
}
if(i == 4)
delStack(s);
}
free(s);
}
int main()
{
dfs(0);
return 0;
}
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- C++基于栈实现铁轨问题
- 数据结构之Treap详解
- C语言栈的表示与实现实例详解
- C语言实现颠倒栈的方法
- 算法系列15天速成 第十天 栈
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- 一看就懂:图解C#中的值类型、引用类型、栈、堆、ref、out
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Array栈方法和队列方法的特点说明
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- Java数据结构及算法实例:插入排序 Insertion Sort