算术表达式

来源:互联网 发布:制导算法 编辑:程序博客网 时间:2024/04/29 11:53

//引用头文件

#include<iostream>

#include<cstdio>

#include<cstdlib>

using namespace std;

typedef int ElemType;

const int STACK_INIT_SIZE=100; //存储空间的初始化分配量

const int STACKINCREMENT=10;//存储空间分配增量

typedef struct {ElemType *base;  //存储空间基址

ElemType *top;//栈顶指针

int stacksize;//当前分配的存储空间}Stack;

//函数声明

int IfEmptyStack(Stack S);

void InitStack(Stack &S);

void EmptyStack(Stack &S);

void Push(Stack &S, ElemType e);

void Pop(Stack &S, ElemType &e);

void ShowStack(Stack S);

//声明定义变量

int In(char ch);

char Precede(char a, char b);

int Operate(int a, char f, int b);

int IfEmptyStack(Stack S){//判断是否为空栈

if(S.base==S.top)  return 1;  return 0;}

void InitStack(Stack &S){//构造一个空栈

S.base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));

S.top=S.base;   S.stacksize=STACK_INIT_SIZE;  return;}

void EmptyStack(Stack &S){//若栈空则无返回值

S.top=S.base;  return ;}

 

void Push(Stack &S, ElemType e){//插入元素e为新的栈顶元素(入栈)

if(S.top-S.base>=S.stacksize){

S.base=(ElemType *)realloc(S.base, (S.stacksize+STACKINCREMENT)*sizeof(ElemType));

S.top=S.base+S.stacksize;

S.stacksize+=STACKINCREMENT;

} *S.top++=e;  return ;}

void Pop(Stack &S, ElemType &e){//若栈不空则删除s的栈顶元素,用e返回其值,否则无返回值

if(S.top==S.base)return ;  e=*--S.top;  return ;}

ElemType GetTop(Stack &S){//若栈不空则返回s的栈顶元素,否则无返回值

if(S.top==S.base) return 0;  return *(S.top-1);}

void ShowStack(Stack S){//输出

ElemType *p=S.base;   while(p!=S.top)printf("%d",*p++);   return;}

int In(char ch){  int res;  switch(ch){

case '+':  case '-':  case '*':  case '/':  case '(':  case ')':

case '=': res=1;break;  default: res=0;break;  case '@': exit(0);}

return res;}

char Precede(char a, char b){//判断符号的优先级

int i,j;   int form[7][7]={

{1,1,-1,-1,-1,1,1},  {1,1,-1,-1,-1,1,1},  {1,1,1,1,-1,1,1},

{1,1,1,1,-1,1,1},  {-1,-1,-1,-1,-1,0,2},  {1,1,1,1,2,1,1},{-1,-1,-1,-1,-1,2,0}};

switch(a){case '+':i=0;break;  case '-':i=1;break;

case '*':i=2;break;  case '/':i=3;break;  case '(':i=4;break;

case ')':i=5;break;  case '=':i=6;break;}switch(b){

case '+':j=0;break;  case '-':j=1;break;  case '*':j=2;break;

case '/':j=3;break;  case '(':j=4;break;  case ')':j=5;break;

case '=':j=6;break;//出栈时的结尾判断}//栈顶元素优先级

if(form[i][j]==1)return '>';

else if(form[i][j])return '<';

else   return '=';}

int Operate(int a, char f, int b){ switch(f){

case '+': return a+b;  case '-': return a-b;

case '*': return a*b;  case '/': return a/b;}return 0;}

void EvaluateExpression(){//定义执行函数并实现相关操作

char c, d[100];

int i, f, num, tmpa, tmpb;

Stack OPTR, OPND;

InitStack(OPTR);InitStack(OPND);

Push(OPTR, '=');  c=getchar();

while(c!='='||GetTop(OPTR)!='='){

if(c>='0'&&c<='9'){ i=0;

 do{d[i++]=c;   c=getchar();

   }while(c>='0'&&c<='9');

 d[i]='/0'; num=atoi(d);

   Push(OPND, num);}else if(In(c)){

   switch(Precede(GetTop(OPTR), c)) {

    case '<': Push(OPTR, (int)c);c=getchar(); break;

    case '=': Pop(OPTR, f);c=getchar(); break;

    case '>': Pop(OPTR, f);Pop(OPND, tmpb);Pop(OPND, tmpa);

       Push(OPND, Operate(tmpa, f, tmpb));  break;  }}}

c=getchar();//接收最后输入的一个回车符!!!否则在主函数中只能输入一次...

cout<<"所求表达式的值为:";  ShowStack(OPND);  cout<<endl<<endl;}//主函数

int main(){

cout<<"输入@结束操作!";

cout<<"请输入表达式,=结束求值:"<<endl;

while(1){EvaluateExpression();

cout<<endl;

cout<<"请再输入表达式,=结束求值:"<<endl;}return 0;}

原创粉丝点击