#include<stdio.h>
#include<math.h>
#include<stdlib.h>
typedef float Type;
typedef struct{
Type *top;//顶指针
Type *base; //基指针
int size;//容量
}Stack;
Stack stack;
//stack1->size = 10;
//stack2->size = 10;
void Init(Stack *s){//尝试一下直接传入结构体变量,而不使用指针
s->base = malloc((s->size+1)*sizeof(Type));
s->top = s->base;
}
int Strlen(Stack *s){
return(s->top - s->base);
}
void IsFull(Stack *s){
if(Strlen(s) >= s->size){
printf("full");
exit(0);
}
}
void IsEmpty(Stack *s){
if(Strlen(s) <= 0){
printf("empty");
exit(0);
}
}
void push(Stack *s, Type c){
IsFull(s);
++s->top;
*(s->top) = c;
}
char pop(Stack *s){
IsEmpty(s);
return *(s->top--);
}
int main(){
Stack stack;
stack.size = 10;
Stack *s = &stack;
Init(s);
char c;
Type c1, c2;
Type temp;
while(1){
scanf("%c", &c);
if(c == '#')break;
else if(c <= 57 && c >= 48){
Type cc = (Type)(c - 48);
push(s, cc);
}else
switch(c){
case '+': c1 = pop(s);c2 = pop(s);temp = c1 + c2;push(s, temp);break;
case '-': c1 = pop(s);c2 = pop(s);temp = c1 - c2;push(s, temp);break;
case '*': c1 = pop(s);c2 = pop(s);temp = c1 * c2;push(s, temp);break;
case '/': c1 = pop(s);c2 = pop(s);temp = c1 / c2;push(s, temp);break;
}
}
printf("%f", temp);
return 0;
}
字符转浮点型
栈中存储的不再是之前的字符型,而是浮点型。因此在接收输入缓冲区的字符后,要利用ascii码的-48转换成浮点型。
scanf("%c", &c);
if(c == '#')break;
else if(c <= 57 && c >= 48){
Type cc = (Type)(c - 48);
push(s, cc);
switch语句的运用
选择逻辑通过if else语句和switch case语句结合
1.如果不要case顺序执行的话,每个case之后都要用break语句跳出switch
2.case后的常量表达式必须有一个确定的值
3.表达式和常量表达式必须为整形:int char short 等
4.case的顺序出现的位置并不影响程序的执行结果
5.多组case可以共用一组语句。
switch(c){
case '+': c1 = pop(s);c2 = pop(s);temp = c1 + c2;push(s, temp);break;
case '-': c1 = pop(s);c2 = pop(s);temp = c1 - c2;push(s, temp);break;
case '*': c1 = pop(s);c2 = pop(s);temp = c1 * c2;push(s, temp);break;
case '/': c1 = pop(s);c2 = pop(s);temp = c1 / c2;push(s, temp);break;
}