永发信息网

C#中,中缀表达式如何转化为后缀表达式?

答案:1  悬赏:30  手机版
解决时间 2021-05-05 13:53
用C#代码写出转换流程,而不是给出一个四则运算符后用大脑去转换的,谢谢各位大侠的帮助
最佳答案

这是算法


#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define MAXNUM 100
typedef int DataType;
typedef struct
{
DataType s[MAXNUM];
int t;
}SeqStack,*PSeqStack;


//构造一个空栈
PSeqStack createEmptyStack_seq()
{
PSeqStack pastack;
pastack=(SeqStack*)malloc(sizeof( SeqStack));

if (pastack==NULL)
{
printf("空间不够!!\n");
}
else
{
pastack->t=-1;
}
return pastack;//返回空栈顶
}


//清空栈
int isEmptyStack_seq(PSeqStack pastack)
{
return pastack->t==-1;

}


//入栈
void push_seq(PSeqStack pastack, DataType x)
{
if (pastack->t >= MAXNUM - 1)

printf("上溢!\n");
else
{
pastack->t = pastack->t+1;
pastack->s[pastack->t]=x;
}
}

//出栈
void pop_seq(PSeqStack pastack)
{
if (pastack->t==-1)
{
printf("下溢!\n");
}
else
{
pastack->t = pastack->t-1;
}
}

//返回栈顶元素的值
DataType top_seq(PSeqStack pastack)
{
return pastack->s[pastack->t];
}




int infixtoSuffix(const char* infix, char* suffix)
{
int state_int = FALSE;
char c, c2;
PSeqStack ps = createEmptyStack_seq();
int i, j = 0;
if(infix[0]=='\0')
{
return FALSE;
}
for(i=0; infix[i]!='\0';i++)
{
c=infix[i];

switch(c)
{
case ' ':
case '\t':
case '\n':
if(state_int== TRUE)
{
suffix[j++]=' ';
}
state_int= FALSE;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
state_int =TRUE;
suffix[j++]=c;
break;
case '(':
if(state_int==TRUE)
{
suffix[j++]=' ';
}
state_int=FALSE;

push_seq(ps, c);
break;
case ')':
if(state_int== TRUE)
{
suffix[j++]=' ';
}
state_int=FALSE;
c2 = ')';
while(!isEmptyStack_seq(ps))
{
c2=top_seq(ps);
pop_seq(ps);
if(c2 =='(')
{
break;
}
suffix[j++]=c2;
}
if(c2 !='(')
{
free(ps);
suffix[j++]='\0';
return FALSE;
}
break;
case '+':
case '-':
if(state_int == TRUE)
{
suffix[j++] = ' ';
}
state_int = FALSE;
while(!isEmptyStack_seq(ps))
{
c2 = top_seq(ps);
if(c2 =='+'|| c2 =='-'|| c2 == '*' || c2 == '/')
{
pop_seq(ps);
suffix[j++] = c2;
}
else if(c2=='(')
{
break;
}
}
push_seq(ps, c);
break;
case '*':
case '/':
if(state_int==TRUE)
{
suffix[j++] = ' ';
}
state_int = FALSE;
while(!isEmptyStack_seq(ps))
{
c2 = top_seq(ps);
if(c2 == '*' || c2 == '/')
{
pop_seq(ps);
suffix[j++] = c2;
}
else if(c2=='+'||c2=='-'||c2=='(')
{
break;
}
}
push_seq(ps, c);
break;
default:
free(ps);
suffix[j++] = '\0';
return FALSE;
}
}
if(state_int == TRUE)
{
suffix[j++] = ' ';
}
while(!isEmptyStack_seq(ps))
{
c2 = top_seq(ps);
pop_seq(ps);
if(c2 == '(')
{
free(ps);
suffix[j++] = '\0';
return FALSE;
}
suffix[j++] = c2;
}
free(ps);
suffix[j++] = '\0';
return TRUE;
}


//计算后缀
int calculateSuffix(const char * suffix, int * presult)
{

int state_int = FALSE;
PSeqStack ps = createEmptyStack_seq();
int num = 0, num1, num2;
int i;
char c;
for(i = 0; suffix[i] != '\0'; i++)
{
c = suffix[i];
switch(c)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if(state_int == TRUE)
{
num = num * 10 + c - '0';
}
else
{
num = c - '0';
}
state_int = TRUE;
break;
case ' ':
case'\t':
case '\n':
if (state_int == TRUE)
{
push_seq(ps, num);
state_int = FALSE;
}
break;
case '+':
case '-':
case '*':
case '/':
if(state_int == TRUE)
{
push_seq(ps, num);
state_int = FALSE;
}
if(isEmptyStack_seq(ps))
{
free(ps);
return FALSE;
}
num2 = top_seq(ps);
pop_seq(ps);
if(isEmptyStack_seq(ps))
{
free(ps);
return FALSE;
}
num1 = top_seq(ps);
pop_seq(ps);
if(c == '+')
{
push_seq(ps, num1 + num2);
}
if(c == '-')
{
push_seq(ps, num1 - num2);
}
if(c == '*')
{
push_seq(ps, num1 * num2);
}
if(c == '/')
{
push_seq(ps, num1 / num2);
}
break;
default:
free(ps);
return FALSE;
}
}
*presult = top_seq(ps);
pop_seq(ps);
if(!isEmptyStack_seq(ps))
{
free(ps);
return FALSE;
}
free(ps);
return TRUE;
}
void getline(char* line, int limit)
{
char c;
int i=0;
while(i<limit-1&&(c = getchar())!=EOF&&c!='\n')
{
line[i++]=c;
}
line[i]='\0';
}


//主函数
void main()
{
char c, infix[MAXNUM], suffix[MAXNUM];
int result;
int flag = TRUE;
while(flag == TRUE)
{
printf("请输入任意一个整数算术表达式:\n");
getline(infix, MAXNUM);
if(infixtoSuffix(infix, suffix) == TRUE)
{
printf("所有后缀为:%s\n", suffix);
}
else
{
printf("无效缀!\n");
printf("\n继续? (y/n)");
scanf("%c", &c);
if(c == 'n' || c == 'N')
{
flag = FALSE;
}
while(getchar() != '\n');
{
printf("\n");
}
continue;
}

if(calculateSuffix(suffix, &result) == TRUE)
{
printf("结果为:%d\n", result);
}
else
{
printf("非法后缀!\n");
}
printf("\n继续? (y/n)");
scanf("%c", &c);
if(c == 'n' || c == 'N')
{
flag = FALSE;
}
while(getchar() != '\n');
{
printf("\n");
}
}
}

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
未婚先孕奇怪吗?
如何理解爱情二字?
漳州户口要上厦门双十中学要怎么办!
亚洲第一组合?
怎么解决电脑开机时要按键盘的问题
谁有伊苏 菲尔盖纳之誓约 修改器
怎么样才可以看穿一个人?
最近国外出了个15岁摇滚男歌手叫什么名字啊
我是一名即将毕业的大专生,现在要写一份自我
深圳距离台湾多少公里,泉州人,到台湾旅游,
美时美刻化妆造型地址在哪,我要去那里办事
DNF墨竹手镯哪个图爆率最大
为什么我家地下城与勇士玩着玩着就弹出来了
法国大革命爆发的时间和标志是哪些?
怎么才能删除等待上传照片
推荐资讯
腾讯游戏最新最新的游戏是什么?最近会出什么
夏天穿黑色衣服好吗?
请问我国古代的三从四德是??
腾飞电料地址有知道的么?有点事想过去
表达为他人服务的诗词,形容各项事业蓬勃发展
在自己日志里的评论能否显示在好友动态里
第一号养生会所地址在哪,我要去那里办事
仲夏夜之梦所有台词,仲夏夜之梦 简介
天津地区V8多钱?
现在什么谁最红啊
IS会员怎么刷贡献
书英文怎么写
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?