📄 jisuanqi3.c
字号:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define MAX 1024
int precede(char oper1, char oper2){
switch(oper1){
case '+':
switch(oper2){
case '+': case '-': case ')': case'#': case '=': return 1;
case '*': case '/': case '(': case '^': return -1;
default: break;
}
break;
case '-':
switch(oper2){
case '+': case '-': case ')': case '#': case '=': return 1;
case '*': case '/': case '(': case '^': return -1;
default: break;
}
break;
case '*':
switch(oper2){
case '+': case '-': case '*': case '/': case ')': case '#': case '=': return 1;
case '(': case '^': return -1;
default: break;
}
break;
case '/':
switch(oper2){
case '+': case '-': case '*': case '/': case ')': case '#': case '=': return 1;
case '(': case '^': return -1;
default: break;
}
break;
case '(':
switch(oper2){
case '+': case '-': case '*': case '/': case '(': case '^': return -1;
case ')': return 2;
default: break;
}
break;
case ')':
switch(oper2){
case '+': case '-': case '*': case '/': case ')': case '#': case '^': case '=': return 1;
default: break;
}
break;
case '^':
switch(oper2){
case '+': case '-': case '*': case '/': case ')': case '#': case '=': return 1;
case '(': case '^': return -1;
default: break;
}
break;
case '#':
switch(oper2){
case '+': case '-': case '*': case '/': case '(': case '^': return -1;
case '=': return 0;
default: break;
}
break;
default: break;
}
return -2;
}
int main()
{
char oper[MAX], str[MAX], c, tmp[100], op;
long num[MAX];
int i, k, cmp;
int opcnt, ncnt, flag, cop;
long a, b;
while(gets(str)){
if(strcmp(str, "") == 0) break;
memset(oper, 0, MAX);
memset(num, 0, MAX*sizeof(long));
flag = opcnt = ncnt = cmp = cop = 0;
oper[opcnt++] = '#';
k = 0;
c = str[k++];
while(flag == 0){
if(c == ' '){
c = str[k++];
continue;
}
if(c <= '9' && c >= '0'){ /*获取操作数并入栈,栈顶上移*/
tmp[0] = c;
for(i = 1;(c = str[k++]) != '\n' && c != EOF;i++){
if(c >= '0' && c <= '9'){
tmp[i] = c;
}else{
break;
}
}
tmp[i] = '\0';
num[ncnt++] = atol(tmp);
}else{
cop = 0;
while(flag == 0 && cop == 0){
if(c != '\n' && c != EOF && c != '\0'){
op = c;
}
switch((cmp = precede(oper[opcnt-1], op))){
case 1:
a = num[ncnt-2]; /*操作数出栈*/
b = num[ncnt-1];
switch(oper[opcnt-1]){
case '+':
num[ncnt-2] = a + b;
break;
case '-':
num[ncnt-2] = a - b;
break;
case '*':
num[ncnt-2] = a * b;
break;
case '/':
num[ncnt-2] = a / b;
break;
case '^':
num[ncnt-2] = (long)pow(a, b);
break;
default:
break;
}
opcnt--; /*栈顶下移*/
ncnt--;
break;
case -1:
oper[opcnt++] = op; /*操作符号入栈,栈顶上移*/
c = str[k++];
cop = 1;
break;
case 2:
opcnt--; /*脱括号,操作符号栈顶下移*/
c = str[k++];
cop = 1;
break;
case 0:
flag = 1;
break;
default: break;
}
}
}
}
printf("%ld\n", num[0]);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -