关于数据输入的一点看法
查看原帖
关于数据输入的一点看法
821048
gpfgpf楼主2023/1/8 23:15

原始代码前十个点RE、后一个AC,过滤除了数字和运算符号之外的符号后就AC了。数据输入似乎含有换行或空格?与题目描述不符?如有错误,请大佬指正
AC代码如下

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<ctype.h>
#include<string.h>
#include<time.h>
typedef struct Node {
    int jc;//判断存储的是数字还是符号
    int val;
    struct Node * right;
    struct Node * left;
} *List;
int opc(char ch)
{
    switch (ch)
    {
    case '^':
        return 3;
    case '*':case '/':
        return 2;
    case '+':case '-':
        return 1;
    case '(':case ')':
        return 0;
    default:
        return -1;
    }
}
List create(List p,char c)
{
    if(p==NULL)
    {
        p=(List)malloc(sizeof(struct Node));
        p->left=NULL;
        p->right=NULL;
        p->val=c;
        return p;
    }
    else
    {
        List pp=(List)malloc(sizeof(struct Node));
        pp->left=p;
        pp->right=NULL;
        p->right=pp;
        pp->val=c;
        return pp;
    }
}
List de(List p)
{
    if(p==NULL)
    return NULL;
    else
    {
        List pp=p->left;
        if(pp)
        pp->right=p->right;
        if(p->right)
        (p->right)->left=pp;
        free(p);
        return pp;//返回删除结点的左边
    }
}
void print(List p)
{
    while(p)
    {
        if(p->jc)
        printf("%c ",p->val);
        else
        printf("%d ",p->val);
        p=p->right;
    }
    printf("\n");
    return ;
}
long long power(long long a,long long b)
{
	long long tmp=1;
	for(long long i=0;i<b;i++)
	{
		tmp*=a;
	}
	return tmp;
}
int cal(char ch,int a,int b)
{
    switch (ch)
    {
    case '+':
        return a+b;
    case '-':
        return a-b;
    case '*':
        return a*b;
    case '/':
        return a/b;
    default:
        return power(a,b);
    }
}
int main()
{
    List data=NULL,op=NULL;//数字、符号
    List data2=data,op2=op;
    char ch;
    while(scanf("%c",&ch)!=EOF)//中缀转后缀
    {
        if(isdigit(ch))
        {
            data2=create(data2,ch-'0');
            if(data==NULL)
            data=data2;
            data2->jc=0;//代表数字
        }        
        else if(opc(ch)>=0)
        {
            while(op2&&ch!='('&&opc(op2->val)>=opc(ch)&&((op2->val!='^')||(ch!='^')))
            {
                if(op2->val=='('&&ch==')')
                break;
                data2=create(data2,op2->val);
                data2->jc=1;//代表符号
                op2=de(op2);
            }
            if(op2&&op2->val=='('&&ch==')')
            op2=de(op2);
            else
            {
                op2=create(op2,ch);
                if(op==NULL)
                op=op2;
                op2->jc=1; 
            }          
        }
    }
    while(op2)
    {
        data2=create(data2,op2->val);
        data2->jc=1;
        op2=de(op2);
    }

    print(data);
    List tmp=data;
    while (data->right)
    {
        while(tmp->right&&tmp->jc==0)
        tmp=tmp->right;
        char cc=tmp->val;
        (tmp->left)->left->val=cal(cc,(tmp->left)->left->val,(tmp->left)->val);
        de(tmp->left);
        tmp=de(tmp);
        print(data);
    }
    system("pause");
    return 0;
}
2023/1/8 23:15
加载中...