yituei 2018-11-28 00:40 采纳率: 100%
浏览 833
已采纳

数据结构题目(c语言),把只能实现带小括号的表达式计算改为可以带小中大括号的表达式计算

  • 写回答

1条回答 默认 最新

  • qq_39525174 2018-11-28 04:02
    关注

    做了2个小时,一定要给我悬赏呀。
    先做一些说明:
    1.你提供的那个网站写的并不好,我给你个更好的,https://www.cnblogs.com/hantalk/p/8734511.html
    2.这个的输入不能有空格,这个是因为这里使用的是C语言的scanf,如果你使用C++的getline的话,就可以读入带空格的输入了

    代码如下:

    #include
    #include
    #define MaxSize 100
    //检验错误的栈
    struct errstack
    {
    char data[MaxSize];
    int top;
    }es;
    //符号栈
    struct opstack {
    char data[MaxSize];//存储操作符
    int top;//指向栈顶的指针
    }op;
    //数值栈
    struct ststack {
    float data[MaxSize];//存储操作符数
    int top;//指向栈顶的指针
    }st;

    int checkError(char exp[])
    {
    int i = 0;
    es.top = -1;
    while (exp[i] != '\0')
    {
    if (exp[i] == '(' || exp[i] == '[' || exp[i] == '{')
    {
    es.top++;
    es.data[es.top] = exp[i];
    }
    else if(exp[i] == ')' || exp[i] == ']' || exp[i] == '}')
    {
    switch (exp[i])
    {
    case ')':
    if (es.top != -1)
    {
    if (es.data[es.top] != '(')
    {
    return 0;
    }
    else
    {
    es.top--;
    }
    }
    else
    {
    return 0;
    }
    break;
    case ']':
    if (es.top != -1)
    {
    if (es.data[es.top] != '[')
    {
    return 0;
    }
    else
    {
    es.top--;
    }
    }
    else
    {
    return 0;
    }
    break;
    case '}':
    if (es.top != -1)
    {
    if (es.data[es.top] != '{')
    {
    return 0;
    }
    else
    {
    es.top--;
    }
    }
    else
    {
    return 0;
    }
    break;
    }
    }
    i++;
    }
    if (es.top != -1)
    return 0;
    else
    return 1;
    }
    //将算术表达式exp转换为后缀表达式postexp
    void trans(char exp[], char postexp[]) {
    char ch;
    int i = 0, j = 0; //i扫描exp的下标,j扫描postexp的下标
    op.top = -1;
    ch = exp[i]; i++;
    while (ch != '\0')
    {
    switch (ch) {
    case '(': //左括号
    op.top++; op.data[op.top] = ch;
    break;
    case ')': //右括号
    while (op.data[op.top] != '(')//若遇到右括弧“)”,则连续出栈输出,直到遇到左括弧“(”为止。其中,左括弧出栈但是并不输出
    {
    postexp[j] = op.data[op.top]; j++;
    op.top--;
    }
    op.top--;
    break;
    case '[':
    op.top++; op.data[op.top] = ch;
    break;
    case ']':
    while (op.data[op.top] != '[')//若遇到右括弧“]”,则连续出栈输出,直到遇到左括弧“[”为止。其中,左括弧出栈但是并不输出
    {
    postexp[j] = op.data[op.top]; j++;
    op.top--;
    }
    op.top--;
    break;
    case '{':
    op.top++; op.data[op.top] = ch;
    break;
    case '}':
    while (op.data[op.top] != '{')//若遇到右括弧“}”,则连续出栈输出,直到遇到左括弧“{”为止。其中,左括弧出栈但是并不输出
    {
    postexp[j] = op.data[op.top]; j++;
    op.top--;
    }
    op.top--;
    break;
    case '+': //为'+'或'-'时,其优先级不大于栈顶任何运算符的优先级,直到')'
    case '-':
    while (op.top != -1 && op.data[op.top] != '(' && op.data[op.top] != '[' && op.data[op.top] != '{')
    {
    postexp[j] = op.data[op.top]; j++;
    op.top--;
    }
    op.top++; op.data[op.top] = ch;
    break;
    case '*':
    case '/': //为'*'或'/'时,其优先级不大于栈顶为'*'或'/'的优先级,直到')'
    while (op.top != -1 && op.data[op.top] != '(' && op.data[op.top] != '[' && op.data[op.top] != '{'
    && (op.data[op.top] == '*' || op.data[op.top] == '/')) {
    postexp[j] = op.data[op.top]; j++;
    op.top--;
    }
    op.top++; op.data[op.top] = ch;
    break;
    case ' ': break; //过滤空格
    default:
    while (ch >= '0' && ch <= '9')
    {
    postexp[j] = ch; j++;
    ch = exp[i]; i++;
    }
    i--;
    postexp[j] = '#'; j++;
    //postexp[j]=' '; j++; //用空格标识一个数值串结束

        }
        ch = exp[i]; i++;
    }
    
    while (op.top != -1) { //此时,exp扫描完毕,栈不空时出栈并存放到postexp中
        postexp[j] = op.data[op.top]; j++;
        op.top--;
    }
    postexp[j] = '\0'; //给postexp表达式添加结束标识
    

    }

    //对后缀表达式postexp求值
    float compvalue(char postexp[]) {
    float d;
    char ch;
    int i = 0;
    st.top = -1;
    ch = postexp[i]; i++;
    while (ch != '\0')
    {
    switch (ch) {
    case '+': st.data[st.top - 1] = st.data[st.top - 1] + st.data[st.top];//遇到操作符就弹出两个数 并将结果进栈
    st.top--; break;
    case '-': st.data[st.top - 1] = st.data[st.top - 1] - st.data[st.top];
    st.top--; break;
    case '*': st.data[st.top - 1] = st.data[st.top - 1] * st.data[st.top];
    st.top--; break;
    case '/':
    if (st.data[st.top] != 0)
    st.data[st.top - 1] = st.data[st.top - 1] / st.data[st.top];
    else {
    printf("\n\t除零错误!\n");//防止除数为0
    exit(0);
    }
    st.top--; break;
    default:
    d = 0;
    while (ch >= '0' && ch <= '9')//遇到操作数就进栈直到#为止
    {
    d = 10 * d + ch - '0';
    ch = postexp[i]; i++;
    }
    st.top++;
    st.data[st.top] = d;

        }
        ch = postexp[i]; i++;
    }
    return st.data[st.top];//输出栈顶元素就是结果 
    

    }

    int main()
    {
    char exp[100];
    scanf("%s", exp);
    char postexp[100];
    float f = 0.0;
    //求exp的逆波兰式,得到postexp
    while(!checkError(exp))
    {
    printf("input error,please input again!\n");
    scanf("%s", exp);
    }
    trans(exp, postexp);
    //对postexp求值
    f = compvalue(postexp);
    printf("%s = %.2f\n", exp, f);
    system("pause");
    return 0;
    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办