| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 447 人关注过本帖
标题:栈的表达式求值问题
只看楼主 加入收藏
zhu924599877
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-4-4
结帖率:0
收藏
已结贴  问题点数:5 回复次数:2 
栈的表达式求值问题
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define STACK_INIT_SIZE1 100
#define STACKINCREMENT1 10
#define STACK_INIT_SIZE2 100
#define STACKINCREMENT2 10
typedef  char SElemType;

typedef int Status;
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;}SqStacks;


typedef struct{
SElemType *base;
SElemType *top;
int stacksize;}SqStackd;

Status InitStack(SqStacks &S){
 S.base=(SElemType *)malloc(STACK_INIT_SIZE1 * sizeof(SElemType));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE1;
return OK;}


Status InitStack(SqStackd &D){
 D.base=(int *)malloc(STACK_INIT_SIZE2 * sizeof(int));
if(!D.base) exit(OVERFLOW);
D.top=D.base;
D.stacksize=STACK_INIT_SIZE2;
return OK;}


Status GetTop(SqStacks S){char e;
    if(S.top==S.base) return ERROR;
    e=*(S.top-1);
    return e;
}


Status GetTop(SqStacks D){int e;
    if(D.top==D.base) return ERROR;
    e=*(D.top-1);
    return e;
}

Status Push(SqStacks &S,SElemType e){
    if(S.top-S.base>=S.stacksize){
    S.base=(SElemType *)realloc(S.base,
        (S.stacksize+STACKINCREMENT1)*sizeof(SElemType));
    if(!S.base) exit(OVERFLOW);
    S.top=S.base+S.stacksize;
    S.stacksize+=STACKINCREMENT1;}
    *S.top++=e;
    return OK;
}

Status Push(SqStackd &D,int e){
    if(D.top-D.base>=D.stacksize){
    D.base=(int *)realloc(D.base,
        (D.stacksize+STACKINCREMENT2)*sizeof(int));
    if(!D.base) exit(OVERFLOW);
    D.top=D.base+D.stacksize;
    D.stacksize+=STACKINCREMENT2;}
    *D.top++=e;
    return OK;
}

Status Pop(SqStacks &S,SElemType &e){
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}

Status Pop(SqStackd &D,int e){
if(D.top==D.base) return ERROR;
e=*--D.top;
return OK;
}



int In(char c,char OP[7])        
{
  char OP[7]={'+','-','*','/','#','(',')'};
  int i;
  for(i = 0; i < 7; i++)
         if(c == OP[i])
            return 1;
            
            return 0;            
}

char Precede(char op,char c)
{                                                
     char ch;              
     if(op=='(' && c==')' || op=='#' && c=='#' )
         ch = '=';
else
     if(op=='+' || op=='-')     
       switch(c)
          {
             case '+':
             case '-':
             case ')':
             case '#': ch = '>'; break;
             case '*':
             case '/':
             case '(': ch = '<';
          }
else
     if(op=='*' || op=='/')   
       switch(c)
          {
            case '+':
            case '-':
            case '*':
            case '/':     
            case ')':
            case '#':    ch = '>'; break;
            case '(':    ch = '<';
          }
else
     if(op=='(')        
       switch(c)
          {
            case '+':
            case '-':
            case '*':
            case '/':
            case '(': ch = '<'; break;
            case '#':   printf("Error!\n"); exit(0);
          }
else
     if(op==')')   
       switch(c)
          {
            case '+':
            case '-':
            case '*':
            case '/':
            case '#': ch = '>'; break;
            case '(': printf("Error!\n"); exit(0);
          }
else
     if(op=='#')              
       switch(c)
          {
            case '+':
            case '-':
            case '*':
            case '/':
            case '(': ch = '<'; break;
            case ')':   printf("Error!\n"); exit(0);
          }
return ch;                              
}           

int Operate(int a,char r,int b)
{
  int s;
  int d1 = a;
  int d2 = b;
  switch(r)
     {
        case '+': s = d1+d2; break;
        case '-': s = d2-d1; break;
        case '*': s = d1*d2; break;
        case '/': s = d2/d1;   
     }
return s;
}


int EvalExpres()   
{    int a,b;char x,theta,c;SqStacks OPTR;SqStackd OPND;
    char OP[7]={'+','-','*','/','#','(',')'};
    InitStack(OPTR);InitStack(OPND);
    Push(OPTR,'#');
    c=getchar();
   
    while(c!='#' || GetTop(OPTR)!='#')
     {      
        if(!In(c,OP))  {Push(OPND,c);c=getchar();}
         else        
        switch(Precede(GetTop(OPTR),c))
          {
              case '<':  
                Push(OPTR,c);
                   c=getchar();
                 break;
              case '=':   
                Pop(OPTR,x);
                c=getchar();
                 break;
              case '>':
                 Pop(OPTR,theta);
                Pop(OPND,b);
                Pop(OPND,a);
                Push(OPND,Operate(a,theta,b)) ;
                 break;               
          }
     }
return (GetTop(OPND));   
}


void main(){

EvalExpres() ;

}
本人初学数据结构  很多不懂的地方 实属菜鸟  望哪位大侠能帮我解决这个问题  希望能在我的代码上找错并运行 c++6.0运行环境
搜索更多相关主题的帖子: 100 top include 表达式 
2012-04-04 13:12
zhu924599877
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-4-4
收藏
得分:0 
求高手支招
2012-04-04 13:33
BianChengNan
Rank: 8Rank: 8
等 级:贵宾
威 望:13
帖 子:302
专家分:972
注 册:2011-11-30
收藏
得分:5 
这个还望楼主自己能亲自调试下

我的群:149544757 C/C++/Assembly 喜欢交流的朋友进,进群请写消息
2012-04-10 13:22
快速回复:栈的表达式求值问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033988 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved