c语言学习笔记八

数据结构的概念
学这东西感觉一下又回到了十年前
数据结构(data structure):数据的组织方式
算法+数据结构=程序


堆栈(后进先出):
示例代码:
#include<stdio.h>
char stack[512];
int top=0;
void push(char c){
stack[top++]=c;
}
char pull(){
return stack[--top];
}
int is_empty(void){
return top==0;
}
int main(void){
push('a');
push('b');
push('c');

while(!is_empty()){
putchar(pull());
}
putchar('\n');
return 0;
}
深试代化搜索
用深度优代搜索解决迷宫问题

#include<stdio.h>
#define MAX_ROW 5
#define MAX_COL 5
/*点坐标*/
struct point {
int row,col;
}
stack[512];
int top=0;
/*压栈*/
void push(struct point p){
stack[top++]=p;
}
/*弹栈*/
struct point pop(void){
return stack[--top];
}
/*检查堆栈是否为空*/
int is_empty(void){
return top==0;
}
/*地图*/
int maze[MAX_ROW][MAX_COL]={
0,1,0,0,0,
0,1,0,1,0,
0,0,0,0,0,
0,1,1,1,0,
0,0,0,1,0,
};
/*输出堆栈值*/
void print_maze(void){
int i,j;
for(i=0;i<MAX_ROW;i++){
for(j=0;j<MAX_COL;j++){
printf("%d ",maze[i][j]);
}
putchar('\n');
}
printf("***************\n");
}
/* */
struct point predecessor[MAX_ROW][MAX_COL]={
{{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
{{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
{{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
{{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
{{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
};
/*保存走地图线路坐标*/
void visit(int row,int col,struct point pre){
struct point visit_point={row,col};
maze[row][col]=2;
predecessor[row][col]=pre;
push(visit_point);
}
int main(){
/*起点*/
struct point p={0,0};
maze[p.row][p.col]=2;
push(p);


while(!is_empty()){
p=pop();
/*goal到达终点*/
if(p.row==MAX_ROW-1&&p.col==MAX_COL-1){
break;
}
/*right*/
if(p.col+1<MAX_COL&&maze[p.row][p.col+1]==0){
visit(p.row,p.col+1,p);
}
/*down*/
if(p.row+1<MAX_ROW&&maze[p.row+1][p.col]==0){
visit(p.row+1,p.col,p);
}
/*left*/
if(p.col-1>=0&&maze[p.row][p.col-1]==0){
visit(p.row,p.col-1,p);
}
/*up*/
if(p.row-1>=0&&maze[p.row-1][p.col]==0){
visit(p.row-1,p.col,p);
}
print_maze();
}
if(p.row==MAX_ROW-1&&p.col==MAX_COL-1){
printf("(%d,%d)\n",p.row,p.col);
while(predecessor[p.row][p.col].row!=-1){
p=predecessor[p.row][p.col];
printf("(%d,%d)\n",p.row,p.col);
}
}else{
printf("No Path!\n");
}
return 0;

}

 

 

队列的广度优代搜索


队列:先进先出
两种操作:入队enqueue/出队dequeue


示例代码:
#include<stdio.h>
#define MAX_ROW 5
#define MAX_COL 5
struct point {int row,col,predecessor;}
queue[512];
int head=0,tail=0;
/*入队*/
void enqueue(struct point p){
queue[tail++]=p;
}
/*出队*/
struct point dequeue(void){
return queue[head++];
}

int is_empty(void){
return head==tail;
}

int maze[MAX_ROW][MAX_COL]={
0,1,0,0,0,
0,1,0,1,0,
0,0,0,0,0,
0,1,1,1,0,
0,0,0,1,0,
};


void print_maze(void){
int i,j;
for(i=0;i<MAX_ROW;i++){
for(j=0;j<MAX_COL;j++){
printf("%d ",maze[i][j]);
}
putchar('\n');
}
printf("***************\n");
}

void visit(int row,int col){
struct point visit_point={row,col,head-1};
maze[row][col]=2;
enqueue(visit_point);
}


int main(void){
struct point p={0,0,-1};
maze[p.row][p.col]=2;
enqueue(p);
while(!is_empty()){
p=dequeue();
/*goal到达终点*/
if(p.row==MAX_ROW-1&&p.col==MAX_COL-1){
break;
}
/*right*/
if(p.col+1<MAX_COL&&maze[p.row][p.col+1]==0){
visit(p.row,p.col+1);
}
/*down*/
if(p.row+1<MAX_ROW&&maze[p.row+1][p.col]==0){
visit(p.row+1,p.col);
}
/*left*/
if(p.col-1>=0&&maze[p.row][p.col-1]==0){
visit(p.row,p.col-1);
}
/*up*/
if(p.row-1>=0&&maze[p.row-1][p.col]==0){
visit(p.row-1,p.col);
}
print_maze();
}
if(p.row==MAX_ROW-1&&p.col==MAX_COL-1){
printf("(%d,%d)\n",p.row,p.col);
while(p.predecessor!=-1){
p=queue[p.predecessor];
printf("(%d,%d)\n",p.row,p.col);
}
}else{
printf("No Path!\n");
}
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值