用棧結構實現逆波蘭計算器
阿新 • • 發佈:2021-02-14
技術標籤:資料結構
“”"
1、實現對逆波蘭輸入的表示式進行計算
2、支援帶小數點的資料
3、正常的表示式 --> 逆波蘭表示式
a+b ---> a b +
a+(b-c) ---> a b c - +
a+(b-c)*d ---> a b c - d * +
“”"
C語言程式碼
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
#define MAXBUFFER 10
#define OK 1
#define ERROR -1
typedef double ElemType;
typedef int Status;
typedef struct
{
ElemType *base;
ElemType *top;
int stackSize;
}sqStack;
Status InitStack(sqStack *s){
s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if(!s-> base){
return ERROR;
}
s->top = s->base;
s->stackSize = STACK_INIT_SIZE;
return OK;
}
Status Push(sqStack *s,ElemType e){
//如果棧滿,追加空間
if(s->top - s->base >= s->stackSize){
s->base = (ElemType *)realloc(s->base,(s->stackSize+STACKINCREMENT) *sizeof(ElemType));
if(!s->base){
return ERROR;
}
s->top = s->base+s->stackSize;
s->stackSize+=STACKINCREMENT;
}
*(s->top)=e;
s->top++;
}
Status Pop(sqStack *s,ElemType *e){
if(s->top==s->base){
return ERROR;
}
*e=*--(s->top);
}
int StackLen(sqStack * s){
return (s->top - s->base);
}
int main(){
sqStack s;
char c;
double d,e;
/*定義緩衝區*/
char str[MAXBUFFER];
int i=0;
InitStack(&s);
printf("請安逆波蘭表示式輸入計算資料,資料之間用空格隔開,以#作為結束標誌:\n");
scanf("%c",&c);
while (c!='#')
{
/*用於過濾資料|判斷字元是否是數字*/
while (isdigit(c)|| c=='.')
{
str[i++] = c;
str[i] = '\0';
if(i>=10){
printf("出錯:輸出的數字位數過長!\n");
return ERROR;
}
scanf("%c",&c);
if(c == ' '){
/* atof
功能:把字串轉換成浮點數
*/
d = atof(str);
Push(&s,d);
i = 0;
break;
}
}
switch (c)
{
case '+':
Pop(&s,&e);
Pop(&s,&d);
Push(&s,d+e);
break;
case '-':
Pop(&s,&e);
Pop(&s,&d);
Push(&s,d-e);
break;
case '*':
Pop(&s,&e);
Pop(&s,&d);
Push(&s,d*e);
break;
case '/':
Pop(&s,&e);
Pop(&s,&d);
if(e!=0){
Push(&s,d/e);
}else{
printf("錯誤:分母不能為0\n");
return ERROR;
}
break;
default:
break;
}
scanf("%c",&c);
}
/*列印最後結果*/
Pop(&s,&d);
printf("\n最後結果為:%lf\n",d);
return 0;
}
/*
5 + (6 + 4) * 8 + 9 / 3
5 6 4 + 8 * 9 3 / + +
5 + 10*8 + 3
*/