| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
#include <stdio.h> 
#include <ctype.h> 
#include <stdlib.h> 
 
#define STACK_INIT_SIZE 20 
#define STACKINCREMENT  10 
#define MAXBUFFER       10 
 
typedef char ElemType; 
typedef struct 
{ 
    ElemType *base; 
    ElemType *top; 
    int stackSize; 
}sqStack; 
 
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; 
} 
 
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 = s->base + s->stackSize; 
        s->stackSize = s->stackSize + STACKINCREMENT; 
    } 
 
    *(s->top) = e;      // 存放数据 
    s->top++; 
} 
int StackLen(sqStack s) 
{ 
    return (s.top - s.base); 
} 
 
Pop(sqStack *s, ElemType *e) 
{ 
    if( s->top == s->base ) 
        return; 
 
    *e = *--(s->top);   // 将栈顶元素弹出并修改栈顶指针 
} 
int jisuan(char ss[100]) 
{    
    sqStack s; 
    int i= 0,j = 0; 
    double d, e; 
    char str[MAXBUFFER]; 
    int i = 0; 
     
   InitStack( &s ); 
 
    while( ss[j] != '#' ) 
    { 
        while( isdigit(ss[j]) || ss[j]=='.' )  // 用于过滤数字 
        { 
            str[i++] = ss[j++]; 
            str[i] = '\0'; 
            if( i >= 10 ) 
            { 
                printf("出错:输入的 个数据过大!\n"); 
                return -1; 
            } 
             
            if( ss[j] == ' ' ) 
            { 
                d = atof(str); 
                Push(&s, d); 
                i = 0; 
                break; 
            } 
        } 
 
        switch( ss[j] ) 
        { 
            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; 
        } 
 
       j++; 
    } 
 
    Pop(&s, &d); 
    printf("\n最终的计算结果为:%f\n", d); 
 
    return 0; 
} 
int main() 
{ 
    sqStack s; 
    char c, e; 
        int i = 0; 
        char ss[200]; 
 
    InitStack( &s ); 
 
    printf("请输入中缀表达式,以#作为结束标志:"); 
    scanf("%c", &c); 
 
    while( c != '#' ) 
    { 
        while( c>='0' && c<='9' ) 
        {   ss[i++] = c; 
            printf("%c", c); 
            scanf("%c", &c); 
            if( c<'0' || c>'9' ) 
            {    
                 
                printf(" "); 
                                ss[i++] = ' '; 
            } 
        } 
 
        if( ')' == c ) 
        { 
            Pop(&s, &e); 
            while( '(' != e ) 
            {   ss[i++] = e; 
                printf("%c ", e); 
                Pop(&s, &e); 
            } 
        } 
        else if( '+'==c || '-'==c ) 
        { 
            if( !StackLen(s) ) 
            { 
                Push(&s, c); 
            } 
            else 
            { 
                do 
                { 
                    Pop(&s, &e); 
                    if( '(' == e ) 
                    { 
                        Push(&s, e); 
                    } 
                    else 
                    {    ss[i++] = e; 
                        printf("%c ", e); 
                    } 
                }while( StackLen(s) && '('!=e ); 
                Push(&s, c); 
            } 
        } 
        else if( '*'==c || '/'==c || '('==c ) 
        { 
            Push(&s, c); 
        } 
        else if( '#'== c ) 
        { 
            break; 
        } 
        else 
        { 
            printf("\n出错:输入格式错误!\n"); 
            return -1; 
        } 
 
        scanf("%c", &c); 
    } 
 
    while( StackLen(s) ) 
    {    
        Pop(&s, &e); 
      printf("%c ", e); 
        ss[i++] = e; 
    } 
        ss[i] = '\0'; 
        printf("输出后缀表达式!"); 
    printf("%s",ss); 
        jisuan(ss); 
 
    return 0; 
} 
 
下面是错误提示 
incompatible types - from 'double *' to 'char *'
char str[MAXBUFFER]; 
改为 
char *str[MAXBUFFER]; 
 
 
 |   
 
 
 
 |