#include "stdio.h"
#define STACK_INIT_SIZE 10
#define STACKINCRENT 4
#include "stdlib.h"
#include "string.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR -1
#define OVERFLOW -1
typedef int Status;
typedef int boolean;
typedef char ElemType;
struct stack {
ElemType *base;//在构造
ElemType *top;//栈顶指针
int stacksize;
};//顺序栈
typedef struct stack Stack;
//构造一个空的栈
Status InitStack (Stack *stack) {
stack->base = (ElemType *)malloc (STACK_INIT_SIZE * sizeof(ElemType));
if (stack->base == NULL) {
exit (OVERFLOW);
}
stack->top = stack->base;
stack->stacksize = STACK_INIT_SIZE;
return OK;
}
//销毁栈
Status DestroyStack (Stack *stack) {
free (stack->base);
stack->base = NULL;
stack->top = NULL;
stack->stacksize = 0;
return OK;
}
//将栈置为空
Status ClearStack (Stack *stack) {
stack->top = stack->base;
return OK;
}
//判断栈是否为空
Status StackEmtpy (Stack *stack) {
if (stack->top == stack->base) {
return TRUE;
}else {
return FALSE;
}
}
//返回s的元素的个数,即使
int StackLength (Stack *const stack) {
return stack->top - stack->base;
}
//返回栈顶元素
Status GetTop (Stack *stack,ElemType *e) {
if (stack->top > stack->base) {
*e = *(stack->top - 1);
return OK;
}
return ERROR;
}
//入栈
Status Push (Stack *stack,ElemType e) {
ElemType *newElem;
if (stack->top - stack->base >= stack->stacksize - 1 ) {
newElem = (ElemType *)realloc (stack->base,(stack->stacksize + STACKINCRENT) *sizeof(ElemType));
if (!newElem) {
exit (OVERFLOW);
}else {
stack->base = newElem;
stack->top = stack->base + stack->stacksize - 1;
stack->stacksize = stack->stacksize + STACKINCRENT;
}
}
*(stack->top) = e;
stack->top++;
return OK;
}
//出栈
Status Pop (Stack *stack,ElemType *e) {
if (stack->top > stack->base) {
*e = *(--stack->top);
return OK;
}else {
return ERROR;
}
}
Status StackTraverse (Stack *stack,void (*visit)(ElemType)) {
ElemType *elem = stack->top;
while (elem != stack->base) {
elem--;
visit (*elem);
}
return OK;
}
//将相应的字符串转化成相应的浮点数,但要确保的是可以转化
double valueOf (char *ch) {
int index = 0;
int i;
double inte = 0;
double flo = 0.1;
double flo2 = 0;
int len1 = strlen(ch);
for (index = 0;index < len1 && ch[index] !='.';index++);
for (i = 0;i < index;i++) {
inte = inte * 10 + (ch[i] - '0');
}
for (i = index + 1;i < len1;i++) {
flo2 = (ch[i] - '0') * flo + flo2;
flo = flo * 0.1;
}
return inte + flo2;
}
boolean isOperate (char ch) {
switch (ch) {
case '=':
case '/':
case '*':
case '-':
case '+':
case '(':
case ')':return TRUE;
default :return FALSE;
}
}
double oper (double x,char op,double y) {
double result = 0.0;
switch(op){
case '+': result = x + y;break;
case '-': result = x - y;break;
case '/': result = x / y;break;
case '*':result = x * y; break;
}
return result;
}
char pro (char ch1,char ch2) {//比较的是ch1和ch2的优先级
char result;//如果是>表示的是ch1的优先级是大于ch2的。等于的话表示的是(),<表示的是ch1的优先级是大于ch2的。
if (ch2 == '+' || ch2 == '-') {
if (ch1 == '*' || ch1 == '/' || ch1 == '(') {
result = '>';
}else {
result = '<';
}
}else if (ch2 == '*' || ch2 == '/') {
if (ch1 == '(') {
result = '>';
}else {
result = '<';
}
}else if (ch2 == '(') {
if (ch1 == ')') {
result = '=';
}else if (ch1 == '=') {
exit (ERROR);
}else {
result = '>';
}
}else if (ch2 == ')') {
exit(ERROR);
}else {
if (ch1 == '=') {
result = '=';
}else if (ch1 == ')') {
exit(ERROR);
}else {
result = '>';
}
}
return result;
}
int main () {
double num[30];
char num2[20];
int count;//数组的下标
int count2 = 0;
char ch;
int n;
int index;
Stack stack1;
char temp;
InitStack(&stack1);
Push(&stack1,'=');
scanf ("%d\n",&n);
GetTop(&stack1,&temp);
for (index = 0;index < n;index++) {
ch = getchar();
count = 0;
while (temp != '=' || ch != '=') {
if (isOperate(ch)) {
switch (pro (ch,temp)) {
case '>': Push(&stack1,ch); ch = getchar();break;
case '=':Pop(&stack1,&ch); ch = getchar ();break;//脱掉相应的字符
case '<':Pop(&stack1,&temp);num[count - 2] = oper (num[count - 2],temp,num[count - 1]); count = count - 1;break;
}
}else {
num2[count2++] = ch;
while (ch = getchar(),isOperate (ch) != TRUE) {
num2[count2++] = ch;
}
num2[count2] = '\0';
num[count++] = valueOf (num2);
count2 = 0;
}
GetTop(&stack1,&temp);
}
printf("%0.2f\n",num[0]);
getchar();
}
return 0;
}
样例输入
2
1.000+2/4=
((1+2)*5+1)/4=
样例输出
1.50
4.00