复习:
栈:先进后出 后进先出 操作栈顶
struct stack
{
typename data[N];
int top;
}
init
push
pop
一、队列:先进先出 后进后出 可以操作队列两端
1.数组队列 链队列
2.循环队列
#include<stdio.h>
#include<stdlib.h>
#define FULL -1
#define EMPTY -2
#define SUC 0
#define N 3
typedef struct queue
{
int rear;//队列的尾下标 入队
int front;//队列头下标 出队
int data[N];
}queue_t;
queue_t * init_queue()
{
queue_t *p=(queue_t*)malloc(sizeof(queue_t));
if(NULL==p)
{
puts("malloc failed");
exit(-1);
}
p->rear = 0;
p->front = 0;
return p;
}
int is_full(queue_t *q)
{
return ((q->rear+1)%N==q->front); //判断队列是否为满
}
int in_queue(queue_t*q,int x)//入队列
{
if(is_full(q))
{
//puts("full");
return FULL;
}
q->data[q->rear] = x;
q->rear = (q->rear+1)%N;//1
return SUC;
}
int is_empty(queue_t *q)//判断是否为空
{
return (q->front==q->rear);
}
int out_queue(queue_t *q,int *pout)//出队列 pout=&out_data *pout-->out_data
{
if(is_empty(q))
{
puts("empty");
return EMPTY;
}
*pout = q->data[q->front];
q->front = (q->front+1)%N;
return SUC;
}
int main()
{
int out_data;
queue_t *q=NULL;
q = init_queue();
in_queue(q,10);
in_queue(q,20);
out_queue(q,&out_data);
printf("%d\n",out_data);
out_queue(q,&out_data);
printf("%d\n",out_data);
}
二、快速排序
冒泡排序改进版 使用的是递归原理 目前最快方法
分而治之的一种排序方式
思路:
1.取第一个数据作为标旗 flag
2.比较排序 实现flag左侧比它小 右侧比它大
3.先排flag的某一侧 重复1 2
细节:
#include<stdio.h>
#define N 5
void swap(int *parr,int low,int high)
{
int tmp;
tmp = parr[low];
parr[low] = parr[high];
parr[high] = tmp;
}
int sort(int *parr,int low,int high)
{
int flag = parr[low];
while(low<high)
{
while(parr[high]>=flag&&low<high)//12 12 13 56 78
{
high--;
}
if(low==high)
{
return low;
}
swap(parr,low,high);
low++;
while(parr[low]<=flag&&low<high)
{
low++;
}
if(low==high)
{
return low;
}
swap(parr,low,high);
high--;
}
return low;
}
void quick_sort(int *parr,int low,int high)
{
int ret = sort(parr,low,high);//细节 每一趟是怎么比较交换的
if(ret+1<high)//先排右侧
{
quick_sort(parr,ret+1,high);
}
if(low<ret-1)
{
quick_sort(parr,low,ret-1);
}
}
void out_arr(int *p)
{
int i;
for(i=0;i<N;i++)
{
printf("%d ",p[i]);
}
}
void input_arr(int *p)
{
int i;
for(i=0;i<N;i++)
{
scanf("%d",&p[i]);
}
}
int main()
{
int arr[N];
//int arr[]={12,3,5,9,41,11,27,23,45,7,10};
puts("the num of integer:");
input_arr(arr);
quick_sort(arr,0,N-1);
out_arr(arr);
}
三、hash查找 哈希
应用:海量数据存储查找
1.区域划分的方法-算法
2.根据方法摆放书架
3.将书存入书架
4.用户输入书名 按照之前方法对书名处理 找到书位置
hash算法:
1.哈希公式
2.根据哈希公式创建哈希表--数据库
3.将数据进行哈希处理(哈希公式处理) 存入哈希表
4.用户输入数据 程序负责根据哈希公式将数据进行哈希处理 找数据
例子1:
1 1000
2 3000
3 5000
4 10000
。。。。
135 10
#include<stdio.h>
int hash_fun(int age)
{
return age-1;
}
void save_message(int *parr,int age,int num)
{
parr[hash_fun(age)] = num;
}
int find_message(int *parr,int find_age)
{
return parr[hash_fun(find_age)];//
}
int main()
{
int arr[135]={0};
int age,num,i=0,find_age;
while(i<3)//键入输入要存储的年龄及人数
{
//输入 age num
puts("please input age num:");
scanf("%d%d",&age,&num);
save_message(arr,age,num);
i++;
}
//用户输入要查询的年龄
puts("please input the age you find:");
scanf("%d",&find_age);
//查询
printf("%d\n",find_message(arr,find_age));
}
例子2:保留余数
冲突
int main()
{
int arr[]={5,6,17,22,13,58,9,15,20,7};
int hash_arr[10]={0};
int bak_arr[9]={0};
save_message(arr,hash_arr,bak_arr);
//用户输入数据
find_message(hash_arr,bak_arr,find_data);
}
作业1:队列
QQ 631758924
615947283
作业2:对于一个字符串 可能含有‘a’-'z' 中的多个字符 字符可以重复
char a[]="abdsdsaavdxaaacd";
编写程序 对于这样一个字符串 输出字符串出现次数最对的字符 以及出现的次数
‘a’ 6
‘b’ 1
'c' 1
ch-'a'