1.括号匹配
#ifndef STACK
#define STACK
typedef struct {
char str[200];
int top;
}*stack, Stack;
#endif
#define max 20
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
void init(stack s) {
s->top = -1;
memset(s->str, '\0', 200);
}
char pop(stack s) {
if (s->top == -1) {
return ' ';
}
char result = s->str[s->top--];
return result;
}
char push(stack s, char ch) {
if (s->top == max - 1) {
return ' ';
}
s->str[++s->top] = ch;
return ch;
}
int main(void)
{
char str[20];
stack s = (stack)malloc(sizeof(Stack));
init(s);
for (int i = 0; i < strlen(str); i++) {
if (str[i] == '(' || str[i] == '[') {
push(s, str[i]);
}
else {
if (str[i] == ')') {
if (s->str[s->top] == '(') {
pop(s);
}
}
else if (str[i] == ']') {
if (s->str[s->top] == '[') {
pop(s);
}
}
}
}
if (s->top == -1) {
puts("匹配");
}
else {
puts("不匹配");
}
return 0;
}
2.线性表两空初始化
typedef struct node{
dataType data,
struct node * next
}Node,*PNode;
PNode pNode= (PNode)malloc(sizeof(Node));
//判空
If (!pNode)
…
//清空
memset(pNode, 0, sizeof(Node));
//初始化
pNode->data = 0;
pNode->next = NULL;
3.
头结点
前插法:s->next = h->next;
h->next =s;
后插法:尾指针r ,r=h;
r->next = s;
r= s;
4.
顺序队列
空队:rear=front=-1;
入队:rear++;
出队:front++;
5.
循环队列
入队:rear = (rear+1)% MaxSize;
出队:front = (front+1)% MaxSize;
队满:(rear+1)%maxsize == front
队满时和队空时rear==front
6.
树:
哈夫曼编码 (频次 X 编码长度)
每次找最小的两个结点构造一棵树,树根结点的权值为两者之和,直至最后所有结点都在树中,左边为0,右边为1。
8.
求叶子节点个数
N=n0+n1+n2+n3
N=0*n0+1*n1+2*n2+3*n3+1
9.
平均查找长度
ASL=(层数*这层的个数 相加)/总数
二、练习
1.要求函数 f能够将数组元素重新排列,奇数在前,偶数在后。
int i, temp;
low =0;
high =low -1;
while (low <high )
{
if (a [low ]%2|=0) low ++
else
{temp =low 与high 交换;};
}
2.(个位)要求函数 f能够将数组元素按照个位排降序,同时要求使用的算法要保证排序稳定性。
int b [len ];
for ( )
{
b [i ]=a [i ]%10;
}
for( i =0;) 趟数
for (j =0;len -i -1;)
{
if (b [i ]<b [i +1]
}
3.(大根堆)要求函数 f返回数组中元素是否构成大根堆,是返回 1,否返回 0。
int a [i ],n ;
for ( i =0;i <n /2;i ++ )
{
if (a [i ]>a [2i +1]||a [i ]>a [i =2] )
return 0;
}
return 1;
4.(折半)x为一个整数,假设数组元素已经排好降序,要求函数 f 运用折半查找算法,
查找数组中是否存在 x,存在返回 1,不存在返回 0。折半:找中间值
low =0;high =len -1;
while ( low <high )
{
mid =(low +high )/i;
if (a [mid ]>x) high =mid -1;
else if (a [mid ]<x) high =mid +1;
else return 1;
}
5.完成函数 f的实现,参数 root 表示二叉树根节点指针,要求函数 f 返回该树的深度。
f (Note * root )
{
if (root ==NULL ) return 0;
left =f (root ->left );
right =f (root ->right);主体部分结束
if(left >right ) return left +1;
else return right +1;
}
6.a[i][j]==1 时表示节点 i 到节点 j 有边,函数 f 需要返回有向图中出度大于入度的顶点的个数。
cont =0;
f (Note * root )
{
for (i =0;i <n; i ++)
cont 1 =0;cont 2=0;
for (j =0;j <n; j ++)
{
if ( a [i ][j ]) cont 1++;
if ( a [j ][i ]) cont 2++;
if ( cont 1>cont 2) cont ++;
else return cont ;
}
}
7.完成函数 f的实现,参数 s表示字符串首地址,字符串中仅有‘(’和‘)’,函数 f返回一个布尔值,当字符串中的‘(’、‘)’恰好匹配时返回真,否则返回假
f (Note * root )
{
while (*s !=NULL )
{
if (*S ==‘(’) i ++;
else if (--i <0) return 0;首元素
}
s ++;下一个元素重复前面
return ! i;
}
8.已知 int数组 a,长度 lena,表示一个集合,数组元素有升序且不重复。
int 数组 b,长度 lenb,表示另一个集合,同样数组元素有升序且不重复。
根据以下函数原型求两个集合并集的大小。
并集:len a +len b -cont;
9.设线性表存放在向量A[arrsize]的前elenum个分量中,且递增有序。
试设计一算法,将x插入到线性表的适当位置上,以保持线性表的有序性。
#define maxsize 1024
typedef int datatype;
typedef struct
{datatype data[maxsize];
int last;
}seqlist;
SINSERT(seqlist *l, datatype x)
{int i=0,j;
if((*l).last>=maxsize-1)
{printf(“overflow./n”); return;}
while((i<=(*l).last)&&((*l).data[i]<x))
i++;
for((j=(*l).last;j>=i;j--)
(*l).data[j+1]=(*l).data[j];
(*l).data[i]=x;
(*l).last++;
}
main()
{int i,elenum;
seqlist *l,y;
datatype x;
l=&y;
printf(“Please input element number:/n”);
scanf(“%d”,&elenum);
(*l).last=elenum-1;
printf(“Please input %d data:/n”,elenum);
for(i=0;i<=(*l).last;i++)
scanf(“%d”,&((*l).data[i]));
printf(“Please input x that you want to insert:/n”);
scanf(“%d”,&x);
SINSERT(l,x);
printf(“The result is:/n”);
for(i=0;i<=(*l).last;i++)
printf(“%d ”,(*l).data[i]);
printf(“/n”);
}
10.已知顺序表中的元素按元素值非递减有序排列,编写一个算法,删除顺序表中多余的值相同的元素。
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR -1
#define OVERFLOW -2
#define MAXSIZE 10;
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList(SqList &L)
{
L.elem=new ElemType[100];
L.length =10;
return OK;
}
Status DeleteList(SqList &L)
{
int j=0,k,i,m;
i=L.elem[j];
while(j<L.length)
{
for(k=0;k<L.length;k++)
if(i==L.elem[k]&&k!=0)
{
for(m=k;m<L.length;m++)
L.elem[m]=L.elem[m+1];
L.length=L.length-1;
}
j=j+1;
i=L.elem[j];
}
return OK;
}
int main()
{
SqList L;
InitList(L);
int i,j;
printf("请输入10个数(中间用空格):");
for(i=0;i<10;i++)
{
scanf("%d",&L.elem[i]);
printf(" ");
}
printf("\n");
DeleteList(L);
printf("删除成功!");
printf("\n");
for(i=0;i<L.length;i++)
printf("%5d",L.elem[i]);
printf("\n");
}
11.编写一个函数,从一给定的顺序表A中删除值在 x-y(xsy)之间的所有元素,要求以较高的效率 来实现。
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType *elem;
int length;
}SqList;
Status InitList(SqList &L)
{
int i;
L.elem=new ElemType[100];
if(!L.elem) exit(OVERFLOW);
L.length=10;
return OK;
}
Status GetElem(SqList &L,int i,ElemType &e)
{
if(i<1||i>L.length) return ERROR;
e=L.elem[i];
return OK;
}
Status DeleteList(SqList &L,int x,int y)
{
int i,j,z;
z=y-x+1;
i=x;
while (L.elem[i]!=NULL)
{
L.elem[i]=L.elem[i+z];
i=i+1;
}
L.length=L.length-z;
return OK;
}
int main()
{
SqList L;
InitList(L);
ElemType e;
int x,y;
int i,k,l;
int q=1;
for(i=0;i<10;i++)
{
L.elem[i]=i;
printf("%5d",L.elem[i]);
}
printf("\n");
printf("请输入x,y:");
scanf("%d,%d",&x,&y);
DeleteList(L,x,y);
for(i=0;i<L.length;i++)
printf("%5d",L.elem[i]);
printf("\n");
return 0;
}