經典表示式棧實現

2021-06-30 16:53:59 字數 4335 閱讀 3511

#include

#include

#define ok 1

#define error 0

#define true 1

#define false 0

#define stack_init_size 100

#define stackincrement 10

#define buffersize 256

typedef int status; //函式返回狀態

typedef int opndelem; //運算元元素型別

typedef structopndstack;

typedef char optrelem;//操作符元素型別

typedef structoptrstack;

//**********運算元棧**********===//

status initstack_opnd(opndstack *s);

//構造乙個空棧s

status gettop_opnd(opndstack s,opndelem *e);

//若棧不為空,則用e返回s的棧頂元素,並返回ok;否則返回false

status push_opnd(opndstack *s,opndelem e);

//插入元素e為新的棧頂元素

status pop_opnd(opndstack *s,opndelem *e);

//若棧s不為空,則刪除s的棧頂元素,用e返回其值,並返回ok,否則返回error

//**********操作符棧**********===//

status initstack_optr(optrstack *s);

//構造乙個空棧s

optrelem gettop_optr(optrstack s);

//若棧不為空,則用e返回s的棧頂元素,並返回ok;否則返回false

status push_optr(optrstack *s,optrelem e);

//插入元素e為新的棧頂元素

status pop_optr(optrstack *s,optrelem *e);

//若棧s不為空,則刪除s的棧頂元素,用e返回其值,並返回ok,否則返回error

//**********==運算操作***************=//

void standard(char *expression);

//將表示式標準化

opndelem evalueateexpression(const char *expression);

//算數表示式求值

status isoperator(char c);

//判斷c是否是乙個操作符

char precede(char op1,char op2);

//判斷op1和op2優先順序的高低,返回』>』,』<』,』=』

opndelem operate(opndelem a,optrelem theta,opndelem b);

//對運算元a,b進行theta運算

const char *getopnd(const char *c,opndelem *op);

//獲得以*c開始的運算元,返回後c為操作符

int main()

printf(「please input an expression:\n」);

gets(expression);

//printf(「before standard:%s\n」,expression);

standard(expression);//標準化

//printf(「standard expression:%s\n」,expression);

result=evalueateexpression(expression);

printf(「the result of the expression:%d\n」,result);

return 0;

}//**********運算元棧**********=//

status initstack_opnd(opndstack *s)

s->top=s->base;

s->stacksize=stack_init_size;

return ok;

}status gettop_opnd(opndstack s,opndelem *e)else

}status push_opnd(opndstack *s,opndelem e)

s->top=s->base+s->stacksize;//更改棧頂指標

s->stacksize+=stackincrement;

} *s->top++=e;

return ok;

}status pop_opnd(opndstack *s,opndelem *e)

e=(–s->top);

return ok;

}//**********操作符棧**********=//

status initstack_optr(optrstack *s)

s->top=s->base;

s->stacksize=stack_init_size;

return ok;

} optrelem gettop_optr(optrstack s)else

return e;

}status push_optr(optrstack *s,optrelem e)

s->top=s->base+s->stacksize;//更改棧頂指標

s->stacksize+=stackincrement;

} *s->top++=e;

return ok;

}status pop_optr(optrstack *s,optrelem *e)

e=(–s->top);

return ok;

} void standard(char *expression)while(*q!=』\0』);

} p++;

} *p++=』#』;

*p=』\0』;

puts(p);

}//**********==運算操作***************=//

opndelem evalueateexpression(const char *expression)

else

switch(precede(gettop_optr(optr),*c))//switch

}//while

gettop_opnd(opnd,&result);

return result;

}const char *getopnd(const char *c,opndelem *op)

*op=sum;

//printf("getopnd:%d\n",*op);

return c;status isoperator(char c)

char precede(char op1,char op2)

break;

case 『-『:

switch(op2)

break;

case 『*』:

switch(op2)

break;

case 『/』:

switch(op2)

break;

case 『(『:

switch(op2)

break;

case 『)』:

switch(op2)

break;

case 『#』:

switch(op2)

break;

default:

return 『<』;

break; } }

opndelem operate(opndelem a,optrelem theta,opndelem b)

rs_i=a/b;

break;

default:

printf(「is not a operator.\n」);

break;

} printf(「%d %c %d = %d\n」,a,theta,b,rs_i);

return rs_i;

表示式求值 棧實現

宣告 僅個人小記 演算法思想 一 設定乙個運算子棧,設定乙個字尾表示式字串 二 從左到右依次對中綴表示式中的每個字元ch分別進行一下處理,直至表示式結束 1.若ch是左括號 將其入棧 2.若 ch 是數字,將其後連續若干數字新增到字尾表示式字串之後,在新增空格作為分割符 3.若ch是運算子,先將棧頂...

棧實現表示式計算

讓index 1,並盤算是否掃瞄到expression最後 index if index expression.length 掃瞄完畢,就順序從數棧和符號棧中pop出相應的數和符號,並執行 while true num1 numstack.pop num2 numstack.pop oper ope...

棧實現表示式計算

原理 數 入棧 入棧 運算子出棧,直到 和 匹配 運算子 當前符優先順序 棧頂符優先順序 入棧 當前符優先順序 棧頂符優先順序 棧內運算子出棧,運算後進棧,再比較 其中 優先順序大於 如下 先建compute.h標頭檔案 pragma once double compute char str 計算 ...