22.栈及栈应用

22.1 入栈出栈及判空实现

/*
    栈
*/

#include<stdio.h>
#define N 10
typedef struct Stack
{
    int top;
    int data[N];
}stack;

stack s = { -1,{0} };

int isempty()
{
    if (s.top == -1)
        return 1;
    else
        return 0;
}

void setEmpty()
{
    s.top = -1;
}

int push(int data)
{
    if (s.top + 1 <= N - 1)
    {
        s.data[++s.top] = data;
        return 1;
    }
    else
    {
        return 0;
    }

}

int pop()
{
    if (isempty())
        return -1;
    else
        return s.data[s.top--];
}

void tenTobinary(int n)
{
    if (n == 0)
        return;
    else
    {
        int m = n % 2;
        push(m);
        tenTobinary(n/2);
    }

}

int main()
{
    int a[10];
    int i;
    for (i = 0; i < 10; i++)
    {
        a[i] = i + 1;
    }
    for (i = 0; i < 10; i++)
        push(a[i]);
    while (!isempty())
    {
        printf("%d\n",pop());
    }
    tenTobinary(100);
    while (!isempty())
    {
        printf("%d", pop());
    }
    printf("\n");
    return 0;
}

22.2 栈实现括号匹配

#include<stdio.h>
#include<string.h>
#define MAX 999

int judge(char p[])
{
    int len = strlen(p);
    int top = -1;
    char s[MAX];
    int i;
    for (i = 0; i < len; i++)
    {
        switch(p[i])
        {
            case '(':
            case '[':
            case '{':
                s[++top] = p[i];
                break;
            case ')':
                if (s[top] == '(')
                    top--;
                else
                    return 0;
                break;
            case ']':
                if (s[top] == '[')
                    top--;
                else
                    return 0;
                break;
            case '}':
                if (s[top] == '{')
                    top--;
                else
                    return 0;
                break;
        }

    }
    if (top == -1)
        return 1;
    else
        return 0;
}

23. 二叉树

23.1 二叉树所有操作

  • 前序遍历

  • 中序遍历

  • 后序遍历

  • 节点总数

  • 各层节点

  • 节点访问

  • 二叉树深度

#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 100
typedef char dataType;
typedef struct bnode
{
    dataType data;
    struct bnode *lChild, *rChild;
}Bnode,*BTree;
typedef struct
{
    BTree data[MAXSIZE];
    int front, rear;
}SeQuence,*PSeqQueue;
BTree createTree()
{
    BTree tree;
    dataType str;
    str = getchar();
    if (str == '#')
        tree = NULL;
    else
    {
        tree = (BTree)malloc(sizeof(Bnode));
        tree->data = str;
        tree->lChild = createTree();
        tree->rChild = createTree();
    }
    return tree;
}


void visit(char ch)
{
    printf("%c \t",ch);
}
void preOrder(BTree tree)
{
    BTree p = tree;
    if (tree == NULL)
        return;
    visit(p->data);
    preOrder(p->lChild);
    preOrder(p->rChild);
}
void inOrder(BTree tree)
{
    BTree p = tree;
    if (tree == NULL)
        return;

    inOrder(p->lChild);
    visit(p->data);
    inOrder(p->rChild);
}
void postOrder(BTree tree)
{
    BTree p = tree;
    if (tree == NULL)
        return;

    postOrder(p->lChild);
    postOrder(p->rChild);
    visit(p->data);
}

PSeqQueue initSeqQueue()
{
    PSeqQueue queue;
    queue = (PSeqQueue)malloc(sizeof(SeQuence));
    if (queue)
    {
        queue->front = queue->rear = 0;
    }
    return queue;
}

int emptyQueue(PSeqQueue queue)
{
    if (queue&&queue->front == queue->rear)
        return 1;
    else
        return 0;

}
int pushQueue(PSeqQueue queue, Bnode *node)
{
    if ((queue->rear + 1) % MAXSIZE == queue->front)
        return -1;
    else
    {
        queue->rear = (queue->rear + 1) % MAXSIZE;
        queue->data[queue->rear] = node;
        return 1;
    }
}

int popQueue(PSeqQueue queue, BTree *node)
{
    if (emptyQueue(queue))
    {
        return -1;
    }
    else
    {
        queue->front = (queue->front + 1) % MAXSIZE;
        *node = queue->data[queue->front];
        return 1;
    }
}

void destryQueue(PSeqQueue *queue)
{
    if (*queue)
    {
        free(*queue);
        *queue = NULL;
    }
}
void levelOrder(BTree tree)
{
    BTree p = tree;
    PSeqQueue queue = initSeqQueue();
    if (p)
    {
        pushQueue(queue,p);
        while (!emptyQueue(queue))
        {
            popQueue(queue,&p);
            visit(p->data);
            if(p->lChild)
                pushQueue(queue, p->lChild);
            if (p->rChild)
                pushQueue(queue, p->rChild);
        }
    }

}
int height(BTree tree)
{
    int h1, h2;
    if (tree == NULL)
        return 0;
    else
    {
        h1 = height(tree->lChild);
        h2 = height(tree->rChild);
        if (h1 > h2)
            return h1 + 1;
        else
            return h2 + 1;
    }

}

void levelCount(BTree tree,int num[],int l)
{
    if (tree)
    {
        num[l]++;
        levelCount(tree->lChild, num, l + 1);
        levelCount(tree->rChild, num, l + 1);
    }
}

int countTree(BTree tree)
{
    int lCount, rCount;
    if (tree == NULL)
        return 0;
    lCount = countTree(tree->lChild);
    rCount = countTree(tree->rChild);
    return lCount + rCount + 1;
}

int main()
{
    BTree tree = createTree();
    int i = 0;
    int countNum[10] = { 0,0,0,0,0,0,0,0,0,0 }, l = 1, treeHeight, treeCount;//记录每层的节点数,l从1开始,树的深度
    treeHeight = height(tree);
    printf("\n此二叉树的深度为: %d\n", treeHeight);

    treeCount = countTree(tree);
    printf("此二叉树的节点总数为: %d\n", treeCount);

    levelCount(tree, countNum, l);
    printf("此二叉树各层的节点数为: ");
    for (i = 1; i <= treeHeight; i++) {
        printf("第%d层数目: %d,  ", i, countNum[i]);
    }
    printf("\n\n");

    printf("先序遍历此二叉树: ");
    preOrder(tree);
    printf("\n");

    printf("中序遍历此二叉树: ");
    inOrder(tree);
    printf("\n");

    printf("后序遍历此二叉树: ");
    postOrder(tree);
    printf("\n");

    printf("层次遍历此二叉树: ");
    levelOrder(tree);
    printf("\n");

    return 0;
}

24.必会小点

24.1 四舍五入

  • 通过float类型转变为int类型即可实现

  • float a;

int b=(int)(a+0.5);

24.2 逗号表达式

逗号表达式的要领:

  • 1.从左到右逐个计算;

  • 2.逗号表达式作为一个整体,它的值为最后一个表达式的值;

  • 3.逗号表达式的优先级别在所有运算符中最低。

例如:

x=y=1;
z=x++,y++,++y;
printf("x=%d,y=%d,z=%d",x,y,z);
由于赋值运算符优先级大于逗号表达式优先级,所以z=1;
x=2;y=3
若z=(x++,y++,++y)
则z=3;
x=2;y=3;
若z=(x++,++y,y++)
则z=2;
x=2;y=3;

同时也说明了一个问题对于z=(x++,y++,++y);中,y++执行完后,再去执行++y,即y++后,y变为2,++y变为3.而不是先y++,只按照赋值,后面+1未操作,这样是不对的。

24.3 void 类型指针

可以指向任何类型的数据,也可以用任意数据类型的指针对void指针赋值。

int *pint;
void *pvoid;

pvoid = pint;  //right;
pint = pvoid;  //error;
pint = (int *)pvoid;//right,强制转化可以

24.4 内存分配

1.静态分配

int a[50];
int *p;
p=a;

2.动态分配

int *p=(int *)malloc(sizeof(int));

24.5 质数分解

#include<stdio.h>
int main()
{
    int i, j, val;
    printf("请输入一个正整数:");
    scanf("%d",&val);
    printf("将该正整数分解质因数输出为:");
    printf("%d=",val);
    for (i = 2; i <val; i++)
    {
        if (val%i == 0)
        {
            printf("%d*", i);
            val /= i;
        }

    }
    printf("%d",val);
    printf("\n");

    return 0;
}

24.6 大小写转化

if (p[i] >= 'a'&&p[i] <= 'z')
        //小写转大写
    //s[i] = p[i] - 32;
        //s[i]=p[i]-'a'+'A';
    if (p[i] >= 'A'&&p[i] <= 'Z')
        //大写转小写
        s[i] = p[i] + 32;
        //s[i] = p[i] - 'A' + 'a';

24.7 字符数字转化为整型数字

'1'--> 1

#include<stdio.h>
int main()
{
    char ch;
    ch=getchar();
    int a = ch - '0';
    //int a = ch - 48;
    printf("%d\n",a);
    //数字转字符
    int b = 98;
    char ch1 = (char)b;
    putchar(ch1);
    return 0;
}

25.常考小点

25.1 完数

例如:6=1+2+3,即所有因子之和

int fun(int n, int a[], int *k)
{
    int t = n;
    int i, j=0;
    for (i = 1; i < n; i++)
    {

        if (n%i == 0)
        {
            a[j++] = i;
            t -= i;
        }
    }
    *k = j;

    if (t == 0)
        return 1;
    else return 0;

}

25.2 闰年

leap = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);

25.3 统计输入的数是几位数

int  fun(int  n)
{
    int bits = 1;
    while (n / 10)
    {
        bits++;
        n /= 10;
    }

    return bits;
}

25.4 注意事项

1.gets/gets_s函数只能传数组名,而不能传指针

2.求int类型数组长度

a[]={1,6,8,3,6,0,10};
int len=sizeof(a)/sizeof(int);

25.5 字符串比较

int compare(char *s1, char *s2)
{
    while (*s1&&*s2&&*s1 == *s2)
    {
        s1++;
        s2++;
    }
    if (*s1 == '\0'&&*s2 == '\0')
        return 0;
    else
        return *s1 - *s2;

}

25.6 转二进制

void stobinary(int *p)
{

    int i,j;
    int k,result;
    int m;
    for (i=0,j=0;j<N;j++)
    {
        k = 1;
        result = 0;
        while (p[j])
        {
            m = p[j] % 2;
            result += k*m;
            k = k * 10;
            p[j] /= 2;
        }
        a[i++] = result;

    }
    int t = i;

    for (i = 0; i < t; i++)
    {
        printf("%3d\n",a[i]);
    }
}

25.7 文件指针

文件指针是指针类型的变量

文件指针是指针变量,存储的是文件缓存首地址,而不是文本在计算机磁盘中的路径信息

b=a>>2后,a还是a,只是b变

注意数组陷阱:a[5]={9,1,3,4};还有一个元素0

25.8 sizeof与strlen

 //指针是固定的4字节
CHAR *A = "SA";
SIZEOF(A)=4;
//如果数组[]没数字,SIZOEF根据后面的字符串长度来算,如果有数字,直接是数字值
CHAR A[] = "ADSASD";
SIZEOF(A) = 7;

25.9 转义符

char *str1 = "asd\0sa";
char *str1 = "ad\0阿斯达";
puts(str1); //ad
//分析:\0后面是字符/汉字,而不是数字,不能表示八进制数,直接推出,输出ad
/*char *str2 = "ad\0125456";
puts(str2);*/  //ad换一行(\n)5456
//分析:\0后面两位与\0表示八进制数,则八进制12对应十进制10即\n;
char *str2 = "ad\085456";
puts(str2); //ad
//分析:\0后面第一位直接是8,超过8进制范围,直接结束,此时只输出ad
//char *str3 = "ad\xgsdd";//编译器报错,无法运行,\x后面的g超出十六进制范围
//char *str3 = "ad\x1112"; //有\x则对后面所有数字组合成十六进制进行转化,而1112转化为十进制4370,会报"对字符来说太大"错误
char *str3 = "ad\x9\05"; //\x9对应制表符
printf("%d", strlen(str3));//strlen,不算末尾的\0,4个字符长 a d 十六进制\x9--对应十进制9即制表符\t  八进制\05对应5对应梅花
puts(str3);
//\x与\0一点不同之处在于,当\x后面跟的数字不符合十六进制,则会报错,因为\x不会像\0那样,\0是字符串结束标记,
//后面跟的数字即使不符合结束标记,它也不会报错,此时会直接作为字符串结束标记,结束字符串,而\x后面必须跟合法的十六
//进制数,否则直接报错。
char *str4 = "\t\017\0qw";
printf("%s", str4);
printf("\n%d\n", strlen(str4)); //2个分别是制表符\t与八进制\017对应的十进制15即太阳,共两个字符
char *str5 = "\ta\017bc";
printf("\n%d,%d\n", strlen(str5), sizeof(str5));  //5 4 5个字符分别是\t a \017 b c

25.10 数字正反序

//正序输出 8765

int n,t,s=1,x=0;
while(n)
{
t=n%10;
x+=t*s;
s*=10;
n/=10;
}

//逆序输出5678

int n,t,x=0;
while(n)
{
t=n%10;
x=x*10+t;
n/=10;
}

25.11 求最后三位

x=x/1000;

25.12 一维与二维数组对比

char *s[] = {"c language","pascal","masm"};
printf("%s\n",s[1]+2);  //输出---scal
printf("%c\n",s[1][2]);//或printf("%c",*(s[1]+2));  //输出s

25.13 优先级

int a = 1,b = 2, c = 0;
printf("%d", a || b&&c); //1,&&优先级高于||优先级

括号成员第一,全体单目第二

&乘除余三   //这个"余"是指取余运算即%

加减四,移位五

关系六,等于不等排第七

位与异或和位或三分天下八九十,逻辑与十一

逻辑或十二,条件(十三、?:)高于赋值(十四=)

逗号运算级最低!

例:

int i = 1 << 1 + 1;
printf("%d",i);  //4---+-优先级排四,位移五

 

如何提高编程能力?(下)_i++