1. 程式人生 > >棧的操作實現逆波蘭表達式的計算

棧的操作實現逆波蘭表達式的計算

std ini 數據 個數 -- log 結束 char else

代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define STACK_INIT_SIZE 20
#define STACKINCREMENT  10
#define MAXBUFFER       10

typedef double ElemType;
typedef struct {
    ElemType *base;
    ElemType *top;
    int StackSize;
}sqStack;
void InitStack(sqStack *s){
    s
->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if( !s->base ){ exit(0); } s->top = s->base; s->StackSize = STACK_INIT_SIZE; } void 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 ){ exit(0); } } *(s->top) = e; s->top++; } void pop(sqStack *s,ElemType *e){ if( s->top == s->base){ return; } *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 -1; } scanf("%c",&c); if ( c== ){ 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("\n出錯,除數為零\n"); return -1; } break; } scanf("%c",&c); } pop(&s,&d); printf("最後的結果為:%f\n",d); return 0; }

棧的操作實現逆波蘭表達式的計算