四则运算的逆波兰式算法

学习数据结构的时候,在栈这节给出逆波兰式的运用,搜了下实现算法

// DataStructure.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

//#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<stack>
#include<math.h>
#include<string.h>
using namespace std;

#define max 100
char ex[max];/*存储后缀表达式*/

void trans()
{
    /*将算术表达式转化为后缀表达式*/
    printf("*****************************************\n");
    printf("*输入一个求值的表达式,以#结束。*\n");
    printf("******************************************\n");
    printf("算数表达式:");
    char str[max];/*存储原算术表达式*/  
    int charSum;
    int i;  
    i=0;/*获取用户输入的表达式元素个数*/
    do{
        i++;
        scanf("%c", &str[i]);
    }while(str[i] != '#' && i != max);
    charSum = i;

    int t=1;    //后缀表达式从1开始
    char stack[max];/*作为运算符栈使用*/
    int top = 0;    //运算符栈顶

    char ch;    
    i=1;        //从1开始
    ch = str[i];
    while(ch != '#')
    {
        switch(ch)
        {
        case '(':   /*判定为左括号,则放置运算符栈中*/
            top++;
            stack[top]=ch;
            break;
        case ')':   /*判定为右括号,则将运算符栈中两括号之间内容放置到后缀表达式中*/
            while(stack[top] != '(')
            {
                ex[t] = stack[top];
                top--;
                t++;
            }
            top--;  //去除'('
            break;
        case '+':   /*判定为加减号,肯定小于等于栈顶元素*/
        case '-':
            while(top !=0 && stack[top] != '(')
            {
                ex[t] = stack[top];
                top--;
                t++;
            }
            top++;  //增加本身
            stack[top]=ch;
            break;
        case '*':   /*判定为乘除号,只会小于等于栈顶非乘除号*/
        case '/':
            while(stack[top] == '*' || stack[top] == '/')
            {
                ex[t]=stack[top];
                top--;
                t++;
            }
            top++;      //增加本身
            stack[top]=ch;
            break;
        case ' ':break;     //空格排除
        default:            /*判定为数字*/
            while(ch>='0'&& ch <= '9')
            {               
                ex[t]=ch;
                t++;

                i++;
                ch=str[i];

            }
            //常规下这里是数字,那么最后导致多加了一次i
            i--;
            ex[t] = ' ';    //数字后置空格
            t++;
        }

        i++;        //下一个字符
        ch = str[i];        
    }

    while(top!=0)
    {
        ex[t]=stack[top];
        t++;
        top--;
    }
    ex[t]=' ';
    printf("\n\t原来表达式:");
    int j = 0;
    for(j=1;j<charSum;j++)
        printf("%c", str[j]);
    printf("\n\t逆波兰式:", ex);
    for(j=1;j<t;j++)
        printf("%c",ex[j]);
    printf("\n");
}

void compvalue()
{
    /*计算后缀表达式的值*/
    float stack[max],d;/*作为栈使用*/
    char ch;
    int t=1,top=0;/*t为ex下标,top为stack下标*/
    ch=ex[t];t++;
    while(ch != ' ')
    {
        switch(ch)
        {
        case '+':
            stack[top-1]=stack[top-1]+stack[top];
            top--;
            break;
        case '-':
            stack[top-1]=stack[top-1]-stack[top];
            top--;
            break;
        case '*':
            stack[top-1]=stack[top-1]*stack[top];
            top--;
            break;
        case '/':
            if(stack[top] !=0 )
            {
                stack[top-1] = stack[top-1] / stack[top];
            }
            else
            {
                printf("\n\t除零错误!\n");
                return;/*异常退出*/
            }
            top--;
            break;
        default:
            d=0;
            while(ch >= '0' && ch <= '9')
            {
                d = 10*d + ch - '0';/*将数字字符转化为对应的数值*/
                ch = ex[t];
                t++;
            }
            top++;
            stack[top]=d;
        }
        ch = ex[t];
        t++;
    }
    printf("\n\t计算结果:%g\n",stack[top]);
}


int _tmain(int argc, _TCHAR* argv[])
{
    trans();
    compvalue();
    system("pause");
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用逆波兰式算法实现四则运算的C程序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAX_STACK_SIZE 100 typedef struct { int top; int data[MAX_STACK_SIZE]; } Stack; void stack_push(Stack *s, int x) { if (s->top == MAX_STACK_SIZE - 1) { printf("Stack overflow!\n"); exit(1); } s->data[++(s->top)] = x; } int stack_pop(Stack *s) { if (s->top == -1) { printf("Stack underflow!\n"); exit(1); } return s->data[(s->top)--]; } int stack_top(Stack *s) { if (s->top == -1) { printf("Stack is empty!\n"); exit(1); } return s->data[s->top]; } int stack_empty(Stack *s) { return s->top == -1; } int stack_size(Stack *s) { return s->top + 1; } int is_operator(char c) { return c == '+' || c == '-' || c == '*' || c == '/'; } int precedence(char op) { switch (op) { case '+': case '-': return 1; case '*': case '/': return 2; default: return 0; } } int eval(char *expr) { Stack operand_stack; operand_stack.top = -1; Stack operator_stack; operator_stack.top = -1; char *token = strtok(expr, " "); while (token != NULL) { if (isdigit(token[0])) { int num = atoi(token); stack_push(&operand_stack, num); } else if (is_operator(token[0])) { while (!stack_empty(&operator_stack) && precedence(token[0]) <= precedence(stack_top(&operator_stack))) { char op = (char) stack_pop(&operator_stack); int num2 = stack_pop(&operand_stack); int num1 = stack_pop(&operand_stack); int result; switch (op) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': result = num1 / num2; break; } stack_push(&operand_stack, result); } stack_push(&operator_stack, (int) token[0]); } token = strtok(NULL, " "); } while (!stack_empty(&operator_stack)) { char op = (char) stack_pop(&operator_stack); int num2 = stack_pop(&operand_stack); int num1 = stack_pop(&operand_stack); int result; switch (op) { case '+': result = num1 + num2; break; case '-': result = num1 - num2; break; case '*': result = num1 * num2; break; case '/': result = num1 / num2; break; } stack_push(&operand_stack, result); } return stack_pop(&operand_stack); } int main() { char expr[100]; printf("Enter an expression in postfix notation: "); fgets(expr, sizeof(expr), stdin); int len = strlen(expr); if (len > 0 && expr[len - 1] == '\n') { expr[len - 1] = '\0'; } int result = eval(expr); printf("Result = %d\n", result); return 0; } ``` 在这个程序中,我们首先定义了一个栈的数据结构,并实现了一些基本的操作,如入栈、出栈、获取栈顶元素、判断栈是否为空、获取栈的大小等。然后我们定义了两个栈,一个用于存放操作数,另一个用于存放操作符。接着,我们通过 `strtok` 函数将输入的后缀表达式切分成一个个的操作数和操作符,并根据逆波兰式的计算规则依次进行计算,最终得到表达式的结果。 在这个程序中,我们假设输入的后缀表达式中的操作数和操作符之间用空格分隔。例如,输入 `5 4 +` 表示的是 `5 + 4` 的结果,输入 `3 4 2 * 1 5 - 2 3 ^ ^ / +` 表示的是 `(3 + 4 * 2 / (1 - 5) ^ 2 ^ 3)` 的结果。如果输入的表达式不合法,程序会输出一些错误信息并退出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值