1. 程式人生 > 其它 >用棧結構實現逆波蘭計算器

用棧結構實現逆波蘭計算器

技術標籤:資料結構

“”"

	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 */

效果:

在這裡插入圖片描述