⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 02050811.c

📁 用C语言实现的算术表达式的运算
💻 C
字号:
#include <stdio.h>
#include <string.h>
#define MAXLEN 20

/* 用数组实现堆栈 */
int opnd_top=-1,optr_top=-1;
double opnd_stack[20]; /*数据栈 */
char optr_stack[20];  /*运算符栈*/

/*运算符数*/
char optr[7]={'+', '-' ,'*' ,'/' ,'(' ,')' ,'#'};

/*优先级数组*/
char priority[7][7]=
{
    {'>','>','<','<','<','>','>'},
    {'>','>','<','<','<','>','>'},
    {'>','>','>','>','<','>','>'},
    {'>','>','>','>','<','>','>'},
    {'<','<','<','<','<','=',' '},
    {'>','>','>','>',' ','>','>'},
    {'<','<','<','<','<',' ','='}
};

/*出栈函数*/
double pop_nd()
{
    double e;
    e=opnd_stack[opnd_top--];
    return e;
}

char pop_tr()
{
    char e;
    e=optr_stack[optr_top--];
    return e;
}

/*压栈函数*/
void push_nd(double e)
{
    opnd_stack[++opnd_top]=e;
}

void push_tr(char e)
{
    optr_stack[++optr_top]=e;

}

/*得到栈顶值的函数*/
double gettop_nd()
{
    return opnd_stack[opnd_top];
}

char gettop_tr()
{
    return optr_stack[optr_top];
}

/*得到某个运算符的在运算符数组的下标,不存在则返回-1*/
int getIndex(char op)
{
    int i;
    for(i=0;i<7;i++)
        if(optr[i]==op) return i;
    return -1;
}


/*得到两个符号的优先级*/
char getprior(char optr1,char optr2)
{
    int i,j;
    i=getIndex(optr1);
    j=getIndex(optr2);
    if(i==-1 || j==-1) 
        return ' ';
    return priority[i][j];
}

/*根据运算符计算出两个一个数的相应结果*/
double calculate(double a,double b ,char c)
{
    double r=0;
    switch(c)
    {
    case '+': 
        r=a+b;
        break;
    case '-':
        r=a-b;
        break;
    case '*':
        r=a*b;
        break;
    case '/':
        r=a/b;
        break;
    }
    return r;
}

main()
{    
    char c;
    /*首先压入一个'#',好等输入结束符'#'时结束*/
    push_tr('#');

    printf("input a expression,end with '#':\n");
    c=getchar();
    while(c!='#' || gettop_tr()!='#')
    {        
        /*是数字则进栈*/
        if(c>='0' && c<='9') 
        {
            push_nd((int)(c-'0'));
            c=getchar();
        }
        else
        {
            switch(getprior(gettop_tr(),c))
            {
            case '<': /*栈顶元素优先权低,则将新接收来的字符入栈,并接收下一个字符*/
                push_tr(c);
                c=getchar();
                break;

            case '=': /*脱括号,并接收下一个字符*/
                pop_tr();
                c=getchar();
                break;

            case '>': /*退栈并将运算结果入栈*/
                push_nd( calculate(pop_nd(),pop_nd(),pop_tr()) );
                break;
            }
        }
    }

    printf("the result is: %f\n",pop_nd());
    scanf("%c",&c);scanf("%c",&c);
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -