4.99 1.06 * 5.99 + 6.99 1.06 * +
这个记法叫作后缀表达式或逆波兰记法,其求值过程是将4.99 和 1.06压入栈中,当碰到加减乘除时,将这两个数出栈 最后进行相乘,将新值压入栈中,碰到数值就进行压栈,下一个数为5.99将数压栈,后面为+号,将5.99和新值出栈,进行相加,得来的新值压栈,后面为6.99将数压栈,最后将1.06压栈,碰到*号.在之前我们将6.99和1.06进行了压栈,栈的形式就是先进后出,所以将6.99*1.06得来的值压栈,碰到加法,将6.99和1.06得来的值和原先的值进行相加结果为:18.6888最后为18.69(进位).
结束符为#.
如果程序有问题请私信告知.
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define SIZE 50
struct Stack {
double pointed;
struct Stack* next;
};
typedef struct Stack* Stack_t;
void IStack(Stack_t* stack_t);
void Posh(Stack_t* stack_t,double val);
double Pop(Stack_t* stack_t);
int stackSize(Stack_t stack_t);
void DeleteStack(Stack_t *stack_t);
int main(void) {
double point_t, point_c,val;
Stack_t stack_t;
IStack(&stack_t);
char str[SIZE];
char ch;
int i = 0;
while ((ch = getchar()) != '#') {
if (isdigit(ch) || ch == '.') {
str[i++] = ch;
str[i] = '\0';
}
else if (ch == ' ') {
if (str[0] == '\0')
continue;
val = atof(str);/*该函数将字符串转换为浮点数*/
Posh(&stack_t, val);
i=0;
str[i]='\0';/*及时将数据清除,存下一个数据*/
continue;
}
switch (ch) {
case '+':
point_t = Pop(&stack_t);
point_c = Pop(&stack_t);
Posh(&stack_t, point_t + point_c);
break;
case '-':
point_t = Pop(&stack_t);
point_c = Pop(&stack_t);
Posh(&stack_t, point_c - point_t);
break;
case '*':
point_t = Pop(&stack_t);
point_c = Pop(&stack_t);
Posh(&stack_t, point_t * point_c);
break;
case '/':
point_t = Pop(&stack_t);
point_c = Pop(&stack_t);
if(point_c != 0)
Posh(&stack_t, point_c / point_t);
break;
}
}
point_t = Pop(&stack_t);
printf("%.2lf",point_t);/*小数的话比如6.87可以是6.9*/
return 0;
}
/*初始化*/
void IStack(Stack_t* stack_t) {
*stack_t = NULL;
}
/*查看栈是否为空*/
int stackSize(Stack_t stack_t) {
return stack_t == NULL;
}
/*压栈*/
void Posh(Stack_t* stack_t,double val) {
Stack_t stack_c=(Stack_t)malloc(sizeof(struct Stack));
Stack_t stack_v = *stack_t;
stack_c->pointed = val;
stack_c->next = NULL;
if (stack_v == NULL)
*stack_t = stack_c;
else {
stack_c->next = *stack_t;
*stack_t = stack_c;
}
}
/*出栈*/
double Pop(Stack_t* stack_t) {
Stack_t stack_c=NULL;
if (stackSize(*stack_t)) {
printf("栈为空\n");
exit(1);
}
double point = (*stack_t)->pointed;
stack_c = (*stack_t);
*stack_t = stack_c->next;
free(stack_c);
return point;
}
/*删栈*/
void DeleteStack(Stack_t* stack_t) {
Stack_t stack_c = *stack_t;
while (*stack_t != NULL) {
*stack_t = stack_c->next;
free(stack_c);
stack_c = *stack_t;
}
}