公告:本站提供编程开发方面的技术交流与分享,打造最佳教程网,希望能为您排忧解难!

C语言教程数据结构C语言实现系列[3]——关于栈的一些习题

数据结构C语言实现系列[3]——关于栈的一些习题

更新时间:2013-04-02 12:32:34 |

#include <stdio.h>
#include <stdlib.h>
typedef int elemType;
#include "LinkAccess.c"

/* 对由fname所指字符串为文件名的程序文件进行括号配对检查 */
int bracketsCheck(char *fname)
{
    struct sNode *a;        /* 申明一个链栈 */   
    char ch;
    FILE *fp;
    fp = fopen(fname, "r");
    if(!fp){
        printf("File '%s' no found! ", fname);
        exit(1);
    }
    initStack(&a);
    ch = fgetc(fp);        /* 从文件中读取第一个字符到ch */
    while(ch != EOF){
        printf("%c", ch);
        switch(ch){
            case '{':
            case '[':
            case '(':
                push(&a, ch);
                break;
            case '}':
                if(peek(&a) == '{'){
                    pop(&a);
                }else{
                    return 0;
                }
                break;
            case ']':
                if(peek(&a) == '['){
                    pop(&a);
                }else{
                    return 0;
                }
                break;
            case ')':
                if(peek(&a) == '('){
                    pop(&a);
                }else{
                    return 0;
                }
                break;
        }
        ch = fgetc(fp);
    }
    if(emptyStack(&a)){
        return 1;
    }else{
        return 0;
    }
}

int main()
{
    if(bracketsCheck("ABCD.c")){
        printf(" Match! ");
    }else{
        printf(" Miss match! ");
    }
    system("pause");
    return 0;
}
#include <stdio.h>
#include <stdlib.h>
typedef double elemType;
#include "LinkAccess.c"

/* 计算由str所指向字符串的后缀表达式(逆波兰式)的值 */
double compute(char *str)
{
    struct sNode *s;/* 用s栈存储操作数和中间计算结果,元素类型为double */
    double x, y;            /* x, y用于保存浮点数 */
    int i = 0;                /* i用于扫描后缀表达式 */
    typedef double elemType;
    initStack(&s);
    /* 扫描后缀表达式中的每个字符,并进行相应处理 */
    while(str[i])
    {
        if(str[i] == ' ')
        {            /* 扫描到空格字符不做任何处理 */
            i++;
            continue;
        }
        switch(str[i])
        {
            case '+':
                x = pop(&s) + pop(&s);
                i++;
                break;
            case '-':
                x = pop(&s);        /* 弹出减数 */
                x = pop(&s) - x;
                i++;
                break;
            case '*':
                x = pop(&s) * pop(&s);
                i++;
                break;
            case '/':
                x= pop(&s);        /* 弹出除数 */
                if(x != 0.0)
                {
                    x = pop(&s) / x;
                }
                else
                {
                    printf("除数为0! ");
                    exit(1);
                }
                i++;
                break;
            default:/* 扫描到的是浮点数字符串,生成对应的浮点数 */
                x = 0;        /* x保存扫描到的整数部分的值 */
                while(str[i] >= 48 && str[i] <= 57)
                {
                    x = x * 10 + str[i] - 48;
                    i++;
                }
                if(str[i] == '.')
                {
                    double j = 10.0;/* j作为相应小数位的权值 */
                    i++;
                    y = 0;
                    while(str[i] >= 48 && str[i] <= 57)
                    {
                        y = y + (str[i] - 48) / j;
                        i++;
                        j *= 10;
                    }
                    x += y;/* 把小数部分合并到整数部分x中 */
                }
        }
        /* 把扫描转换后或进行相应运算后得到的浮点数压入栈s中 */
        push(&s, x);
    }
    /* 若计算结束后栈为空则中止运算 */
    if(emptyStack(&s))
    {
        printf("后缀表达式错误! ");
        exit(1);
    }
    /* 若栈中只有一个元素,则它就是该后缀表达式的值,否则出错 */
    x = pop(&s);
    if(emptyStack(&s))
    {
        return x;
    }
    else
    {
        printf("后缀表达式错误! ");
        exit(1);
    }
}

/* 返回运算符op所对应的优先级数值 */
int precedence(char op)
{
    switch(op)
    {
        case '+':
        case '-':
            return 1;
        case '*':
        case '/':
            return 2;
        case '(':
        case '@':
        default:
            return 0;
    }
}

最佳教程网

最大的技术交流平台 www.goodxyx.com© CopyRight 2011-2013, All Rights Reserved

浙ICP备11033019号