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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值