Google I/O 畅想

还有一天,我们就要迎来 Google I/O 2015 开发者大会,心急的同学可以到官方页面查看 Material Design 的倒计时。根据去年的经验,我为大家预测下2015年谷歌开发者大会的几大看点。

Android M

不得不提的就是下一代安卓操作系统 Android M, 难道真的是 Mooncake ? 但其实,我们不大可能在 I/O 大会上就知道它的全称,在接下来的几个月中,我们应该一直都会使用 M 这个代号。

Google Now 的升级会使安卓手机变得更加智能,不仅语音命令会更加好用,搜索功能也会比以往更加强大。但这一切的一切和中国大陆用户都不会有什么关系。

有消息称,Android M 会更加注重帮你提升工作效率。这包括更安全的操作系统和原生的指纹识别支持,以及由它们带来的新型支付方式– Android Pay.

可穿戴设备

虽然在开发者大会上,谷歌不大可能推出新款的 Nexus 手机,但我们很有可能看到一些智能可穿戴设备。这包括虚拟现实设备(像是 CardBoard),搭载 Android Wear 的智能手表,甚至是新款的 Google Glass.

全面安卓化

谷歌正在用安卓下一盘统治世界的大棋,全面安卓化是他们的终极目标。去年,我们已经见识到了运行在电视上的 Android TV 和运行在汽车上的 Android Auto ,而现在,又有消息说谷歌正在研发用于驱动物联网的安卓系统的变种– Brillo,这无疑又能和智能家居联系在一起。

Google I/O 的主题演讲总是充满了惊喜,相信真正的看点会远远不止以上几条,让我们一起期待吧!

求逆波兰式

逆波兰式,又叫后缀表达式,因其在计算机中使表达式求值变得更为容易,所以有着广泛的应用。本文介绍的是将将普通的中序表达式,转换为逆波兰式的算法。

#include <stdio.h>;
 
typedef struct
    {
        char data[100];
        int top;
    } Stack;
 
int main()
{
    Stack s;
    char ch;
    s.top = -1;
    scanf("%c", &ch);
    while(ch != '#')
    {
        switch(ch)
        {
        case '(':
            s.data[++ s.top] = ch;
            break;
        case ')':
            while(s.data[s.top] != '(')
            {
                printf("%c", s.data[s.top]);
                s.top --;
            }
            s.top --;
            break;
        case '+':
        case '-':
            if(s.data[s.top] == '(')
                s.data[++ s.top] = ch;
            else
            {
                while(s.data[s.top] != '(' && s.top!=-1)
                {
                    printf("%c",s.data[s.top]);
                    s.top --;
                }
                s.data[++ s.top] = ch;
            }
            break;
        case '*':
        case '/':
            if(s.data[s.top] == '(')
                s.data[++ s.top]=ch;
            else
                while(s.data[s.top] != '(')
                {
                    if(s.data[s.top] == '+' || s.data[s.top] == '-' || s.top==-1)
                    {
                        s.data[++ s.top] = ch;
                        break;
                    }
                    else
                    {
                        while(s.data[s.top]=='*' || s.data[s.top]=='/')
                            printf("%c",s.data[s.top--]);
                        s.data[++s.top]=ch;
                        break;
                    }
                }
            break;
        default:
            printf("%c", ch);
        }
        scanf("%c", &ch);
    }
    while(s.top != -1)
    {
        printf("%c", s.data[s.top]);
        s.top --;
    }
    return 0;
}

判断完全二叉树及计算繁茂度

本文介绍二叉树的相关算法,包括建立二叉树、二叉树的中序遍历、计算二叉树繁茂度以及判断完全二叉树。

相关代码如下:

#include<stdio.h>
#include<stdlib.h>

#define A 20
#define MAX 100

typedef struct TNode
{
    char data;
    struct TNode *lchild, *rchild;
} TNode, *BiTree;

typedef struct
{
    BiTree node;
    int layer;
} BTNrecord;

typedef struct
{
    BiTree data[MAX];
    int top;
} SeqStack;

void inorderTraverse(BiTree &T)
{
    SeqStack s;
    s.top = -1;
    BiTree p = T;
    printf("该二叉树的中序遍历为:");
    while( p || ( s.top != -1 ))
    {
        while(p)
        {
            if( s.top == MAX - 1 )
                exit(0);
            s.data[ ++ s.top ] = p;
            p = p -> lchild;
        }
        if(s.top != -1)
        {
            p = s.data[s.top --];
            printf("%c", p -> data);
            p = p -> rchild;
        }
    }
}

int fanmaodu(BiTree &T)
{
    int Count[A];
    BTNrecord Q[MAX], p;
    int f = 0, r = 0, maxl, k, i;
    if(T == NULL) return 0;
    Q[r].node = T;
    Q[r ++].layer = 1;
    for(i = 0; i < A; i ++)
        Count[i] = 0;
    while(r != f)
    {
        p = Q[f];
        f = (f + 1) % MAX;
        Count[p.layer] ++;
        if(p.node -> lchild)
        {
            if((r + 1) % MAX == f)
            {
                printf("OVERFLOW");
                exit(0);
            }
            Q[r].node = p.node -> lchild;
            Q[r].layer = p.layer + 1;
            r = (r + 1) % MAX;
        }
        if(p.node -> rchild)
        {
            if((r + 1) % MAX == f)
            {
                printf("OVERFLOW");
                exit(0);
            }
            Q[r].node = p.node -> rchild;
            Q[r].layer = p.layer + 1;
            r = (r + 1) % MAX;
        }
    }
    k = p.layer;
    for(maxl = Count[1], i = 2; i <= k; i ++)
        if(maxl < Count[i]) maxl = Count[i];
    printf("该二叉树的繁茂度为%d\n", maxl * k );
}

bool checkCpBiTree(BiTree &T)
{
    bool last = false, isCpBiTree = true;
    BiTree s[MAX], p;
    int f = 0, r = 0;
    if(!T) return true;
    s[r] = T;
    r = (r + 1) % MAX;
    while(r != f)
    {
        p = s[f];
        f = (f + 1) % MAX;
        if(!last)
        {
            if(p -> lchild && p -> rchild)
            {
                if((r + 1) % MAX == f) exit(0);
                s[r] = p ->lchild;
                r = (r + 1) % MAX;
                s[r] = p ->rchild;
                r = (r + 1) % MAX;
            }
            else if(p -> lchild && p -> rchild == NULL)
            {
                last = true;
                if((r + 1) % MAX == f) exit(0);
                s[r] = p -> lchild;
                r = (r + 1) % MAX;
            }
            else if(p -> lchild == NULL && p -> rchild)
            {
                last = true;
                isCpBiTree = false;
                break;
            }
            else last = true;
        }
        else
        {
            if(p -> lchild || p -> rchild)
            {
                isCpBiTree = false;
                break;
            }
        }
    }
    if(isCpBiTree)
        printf("该二叉树是完全二叉树\n");
    else
        printf("该二叉树不是完全二叉树\n");
    return isCpBiTree;
}

void createBiTree(BiTree &T)
{
    char ch;
    scanf("%c", &ch);
    if(ch == '#')
        T = NULL;
    else
    {
        if(!(T = (TNode *)malloc(sizeof(TNode))))
        {
            printf("内存分配失败!");
            exit(0);
        }
        T -> data = ch;
        createBiTree( T -> lchild );
        createBiTree( T -> rchild );
    }
}

int main()
{
    BiTree T;
    printf("请按先序序列输入一棵二叉树(空树以“#”代替):\n");
    createBiTree(T);
    inorderTraverse(T);
    printf("\n");
    fanmaodu(T);
    checkCpBiTree(T);
    return 1;
}

JavaScript 游戏 -- Untrusted

给大家推荐一个很好玩的 JavaScript 游戏。

Untrusted – a user javascript adventure game

你需要通过 JavaScript 的知识来帮助游戏中的主角通关,有极高的可玩性。

Nexus 5 刷入 OTA 包

Nexus 5 终于收到 Android 5.1.1 的更新啦!相信很多朋友都掌握了刷入工厂镜像来升级的技巧(如果你还不熟悉,可以移步谷歌的官方指南)。可是,如果你觉得刷入完整镜像过于麻烦,又不想等待 OTA,那么可以参考本文介绍的方法,手动刷入 OTA 包进行升级。

注意:需要1.0.32或以上版本的 adb(文章末尾有下载)。

打开命令行,将手机重启到 Recovery 模式:

adb reboot recovery

看到小机器人倒地的图标,这时按音量上键+电源键,进到 Recovery 的菜单,选择“apply update from adb”。

下载好 OTA 包(文章末尾有下载),重命名为 update.zip ,输入:

adb sideload update.zip

等待进度走到100%就升级完毕啦!

注意:该下载包中的 OTA 包适用于从 LMY47D (5.1.0)升级到 LMY48B(5.1.1)。

下载百度云盘(25MB)