• 大小: 8KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-05-29
  • 语言: 其他
  • 标签: 数据结构  

资源简介

采用栈将中缀表达式转为后缀表达式并求出数值。包含的运算符有'+', '-' ,'*','/','%'。支持整数,小数,正负数

资源截图

代码片段和文件信息

#include
#include
#include
#define Maxlenth 100

typedef struct Stack{
int top;
char s[Maxlenth];
}Stack;

char Pop(Stack *S);
char top(Stack *S);
int Isempty(Stack *S);
double Calculate(char *Arrayint len);
void stackToArray(Stack *Schar *chint len);
void Push(Stack *Schar pu);
void Print(Stack *S);
void clean(char *A);
void check(char *ch);


int main()
{
    Stack num;
    num.top=Maxlenth;/*定义存储操作数的栈的空栈底位置*/
    Stack sign;
    sign.top=Maxlenth;/*定义存储操作符的栈的空栈底位置*/
    Stack *N=#
    Stack *S=&sign;

    char c=‘ ‘;
    int i=0;
    char mid[Maxlenth]={‘\0‘};
    gets(mid);/*读入中缀表达式*/
    check(mid);/*判断是否为合法输入,非法输入时程序退出*/
    int j=0;
    /*将负数的负号用A表示,以区别减号和负号*/
    if(mid[0]==‘-‘)
    {
       mid[0]=‘A‘;
    }
    for(j=1;j    {
        if(mid[j-1]==‘(‘&&mid[j]==‘-‘)
        {
            mid[j]=‘A‘;
        }
    }
    /*按照优先级规则将操作符进栈出栈,操作数入栈时相邻操作数用空格间隔开。
      最终的后缀表达式保存在操作数栈中。
    */
    for(i=0;i    {  //判断mid[i]是否为操作数的一部分,如果是则直接压入操作数栈
        if( (mid[i]>=‘0‘&&mid[i]<=‘9‘)||mid[i]==‘A‘||mid[i]==‘.‘)
        {
            if(mid[i]==‘A‘)
            {
                Push(N‘-‘);
            }
           else{
                    Push(Nmid[i]);
           }
        }
        else
        {
            if(mid[i]==‘(‘)
            {
                Push(Smid[i]);
            }
            else
            {
                if(mid[i]==‘+‘||mid[i]==‘-‘)
                {
                    while(top(S)!=‘(‘&&(!Isempty(S)))
                    {
                        Push(Nc); //将空格压入操作数栈以区分相邻的两个操作数
                        Push(NPop(S));
                    }
                    Push(Nc);
                    Push(Smid[i]);
                }
                else
                {
                    if(mid[i]==‘*‘||mid[i]==‘/‘||mid[i]==‘%‘)
                    {
                        while((top(S)==‘*‘||top(S)==‘/‘||top(S)==‘%‘)&&(!Isempty(S)) )
                        { //弹出优先级大于或等于mid[i]的操作符到操作数栈,
                          //直到栈顶元素优先级比mid[i]小或者栈空为止
                            Push(Nc);
                            Push(NPop(S));
                        }
                        Push(Nc);
                        Push(Smid[i]);
                    }
                    else
                    {
                        if(mid[i]==‘)‘)//遇到左括号时弹操作符栈到操作数栈,直到弹出左括号为止
                        {
                            while(top(S)!=‘(‘ )
                            {
                                Push(Nc);
                                Push(NPop(S));
                            }
                            Push(Nc);
                            Pop(S);
                        }
                    }
                }
            }
        }
    }
    //把操作符栈的元素弹出到操作数栈
    while(!Isempty(S))
    {
        Push(Nc);
        Push(NPop(S));

评论

共有 条评论