标题:求大神解决难题啊 ~~~~~~
只看楼主
yangkkk
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-5-26
结帖率:0
已结贴  问题点数:20 回复次数:2 
求大神解决难题啊 ~~~~~~
实现算术表达式求值程序(栈的运用)
设操作数:0,1,2,……,8,9(可扩充);
运算符:+,—,*,/,(,),#(#号为结束)。
 输入中缀表达式,如:5+(4-2)*3 #,将其转换成后缀表达式:542-3*+#,

#include <stdio.h>
#include <malloc.h>
#include <conio.h>
#include <string.h>
typedef struct node
{
    char data ;
    struct node *next;
}snode,*slink;
int Emptystack(slink S)
{
    if(S==NULL) return(1);
    else return(0);
}
char Pop(slink*top)
{
    char e;
    slink p;
    if (Emptystack(*top)) return(-1);
    else
    {
        e=(*top)->data;
        p=*top;
        *top=(*top)->next;
        free(p);return(e);
    }
}
void Push(slink* top,char e)
{
    slink p;
    p=(slink)malloc(sizeof(snode));
    p->data=e;
    p->next=*top;
    *top=p;
}
void Clearstack(slink*top)
{
    slink p;
    while (*top!=NULL)
    {
        p=(*top)->next;
        Pop(top);
        *top=p;
    }
    *top=NULL;
}
char Getstop(slink S)
{
    if (S!=NULL) return(S->data);
    return(0);
}
int Precede(char x,char y)
{
    switch(x)
    {
       case '(' :x=0;break;
       case '+' :
       case '-' : x=1;break;
       case '*' :
       case '/' : x=2;break;
    }
    switch(y)
    {
    case '+' :
    case '-' :y=1;break;
    case '*' :
    case '/' :y=2;break;
    case '(' :y=3;break;
    }
    if(x>=y)return(1);
    else return(0);
}
void mid_post(char post[],char mid[])
{
    int i=0,j=0;
    char x;
    slink S=(slink)malloc(sizeof(snode));
    Push(&S,'#');
    do
    {
        x=mid[i];
        switch(x)
        {
        case   '#' :
            {
                while(!Emptystack(S))
                    post[j]=Pop(&S);j++;
            }break;
        case   ')' :
            {
                while(Getstop(S)!='(')
                    post[j]=Pop(&S);j++;
                Pop(&S);
            }break;
        case   '+' :
        case   '-' :
        case   '*' :
        case   '/' :
        case   '(' :
            {
                while(Precede(Getstop(S),x))
                    post[j]=Pop(&S);j++;
                Push(&S,x);
            }break;
        }i++;
    }while(x!= '#');
}
double  postcount(char post[])
{
    int i=0;
    char x;
    float z,a,b;
    slink S=(slink)malloc(sizeof(snode));
    while(post[i]!= '#')
    {
        x=post[i];
        switch(x)
        {
        case   '+' :b=Pop(&S);a=Pop(&S);z=a+b;Push(&S,z);break;
        case   '-' :b=Pop(&S);a=Pop(&S);z=a-b;Push(&S,z);break;
        case   '*' :b=Pop(&S);a=Pop(&S);z=a*b;Push(&S,z);break;
        case   '/' :b=Pop(&S);a=Pop(&S);z=a/b;Push(&S,z);break;
        default :x=post[i]- '0' ; Push(&S,x);
        }
        i++;
    }
    if(!Emptystack(S)) return(Getstop(S));
    return 0;
}
void main()
{
    char post[255],mid[255]="  ";
    printf("请输入要处理的中缀表达式:\n",mid);
    scanf_s("%s",mid);
    printf("相应的后缀表达式为: \n","");
    mid_post(post,mid);
    printf( "%s\n",mid_post);
    printf( "表达式的值为: %d",postcount(post));
    getchar();
}
搜索更多相关主题的帖子: next 表达式 return include 
2013-05-26 19:25
yangkkk
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-5-26
得分:0 
求指导哪里出错了
2013-05-26 19:26
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
得分:20 
<数据结构基础C语言版>上有这个例子

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-05-28 06:28



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-408826-1-1.html




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

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