📄 新建 文本文档.cpp
字号:
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 30
int GetStr(char str[]);/*输入算术表达式*/
void Print(char exp[], int len);/*输出表达式*/
int Change(char str[], char exp[]);/*将一般表达式转化为逆波兰表达式*/
float JiSuan(char exp[]); /*求逆波兰表达式的值*/
int main(void)
{
char str[MAX], *pstr=str;/*存储原算术表达式*/
char exp[MAX], *pexp=exp;/*存储转化成的逆波兰表达式*/
float result; /*存储逆波兰表达式的值*/
int len1, len2;/*len1存储原算术表达式的长度,len2存储转化成的逆波兰表达式的长度*/
len1=GetStr(pstr);
printf("原算术表达式: ");
Print(pstr, len1);
len2=Change(pstr, pexp);
printf("逆波兰表达式: ");
Print(pexp,len2);
result=JiSuan(pexp);
printf("The result is: %f", result);
system("pause");
return 0;
}
int GetStr(char str[])
{
int i=0;
printf("请输入算术表达式: ");
do{
scanf("%c", &str[i++]);/*设字符‘#’为表达式的终止符*/
}while(str[i-1] != '#' && i < MAX);
return i;
}
void Print(char exp[], int len)
{
int i;
for(i=0; i<len; i++)
printf("%c", exp[i]);
printf("\n");
}
int Change(char str[], char exp[])
{
int i, t, top;/*t作为exp的下标,top作为stack的下标,i作为str的下标*/
char stack[MAX], ch;/*作为栈使用*/
t=0;
i=0;
top=0;
stack[0]='#';
ch=str[i++];
while(ch != '#')
{
if(ch >= '0' && ch <= '9') //如果是数字,直接存入数组
exp[t++]=ch;
else if(ch == '(') //如果是左括号,入栈
stack[++top]=ch;
else if(ch == ')')//如果是右括号,出栈
{
while(stack[top] != '(')
exp[t++]=stack[top--];
top--;
}
else if(ch == '+' || ch == '-') //如果是操作数,根据优先级出,入栈
{
while(top != 0 && stack[top] != '(')
exp[t++]=stack[top--];
stack[++top]=ch;
}
else if(ch == '*' || ch == '/')
{
while(stack[top] == '*' || stack[top] == '/')
exp[t++]=stack[top--];
stack[++top]=ch;
}
else //不理会错误字符
printf("\n%c ia a wrong letter\n", ch);
ch=str[i++];
}
while(top != 0)
exp[t++]=stack[top--];
exp[t]='#';
return t+1;
}
float JiSuan(char exp[])
{
float stack[MAX], d;/*作为栈使用*/
char c;
int i=0, t=0, top=0;
c=exp[t++];
while(c != '#')
{
d=c-'0';
if(c >= '0' && c <= '9')
stack[top++]=d;
else
{
switch(c)
{
case '+': stack[top-2]=stack[top-2]+stack[top-1];
break;
case '-': stack[top-2]=stack[top-2]-stack[top-1];
break;
case '*': stack[top-2]=stack[top-2]*stack[top-1];
break;
case '/': if(stack[top] != 0)
stack[top-2]=stack[top-2]/stack[top-1];
else
printf("It's error!\n");
break;
}
top--;
}
c=exp[t++];
}
return stack[top-1];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -