Zijeak 2018-12-02 13:03 采纳率: 33.3%
浏览 343

【数据结构】一个简单的问题,向各位大佬求助

用栈实现带括号的四则运算器的简单程序

    现在不管输入什么,一回车程序就结束,什么也不输出,请问是怎么回事
 #include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define Stack_Size 50

typedef char StackElementType;
typedef struct
{
    StackElementType elem[Stack_Size];
    int top;
}SeqStack;

//初始化栈
void InitStack(SeqStack *S)
{
    S->top=-1;
} 

//进栈
int Push(SeqStack *S,StackElementType x)
{
    if(S->top==Stack_Size-1)
     return(FALSE);
    S->top++;
    S->elem[S->top]=x;
    return(TRUE);
}
//出栈
int Pop(SeqStack *S,StackElementType *x)
{
    if(S->top==-1)
     return(FALSE);
    else
    {
        *x=S->elem[S->top];
        S->top--;
        return(TRUE); 
    }
} 
//读栈顶元素
int GetTop(SeqStack *S,StackElementType *x)
{
    if(S->top==-1)
     return(FALSE);
    else
    {
        *x=S->elem[S->top];
        return(TRUE);
    }
} 

//优先级比较函数
StackElementType Compare(StackElementType ch,StackElementType ch_temp)
{
    char compare[7][7]={
        {'<','<','<','<','<','0','>'},
        {'<','<','<','<','<','0','>'},
        {'>','>','<','<','<','0','>'},
        {'>','>','<','<','<','0','>'},
        {'>','>','>','>','>','0','>'},
        {'<','<','<','<','=','0','0'},
        {'<','<','<','<','<','0','0'}

    };
    int index,index_temp;
    switch(ch)
    {
        case '+':index=0;break;
        case '-':index=1;break;
        case '*':index=2;break;
        case '/':index=3;break;
        case '(':index=4;break;
        case ')':index=5;break;
        case '#':index=6;break;
    }
    switch(ch_temp)
    {
        case '+':index_temp=0;break;
        case '-':index_temp=1;break;
        case '*':index_temp=2;break;
        case '/':index_temp=3;break;
        case '(':index_temp=4;break;
        case ')':index_temp=5;break;
        case '#':index_temp=6;break;
    }
    return(compare[index][index_temp]);
}

//计算函数
int Execute(StackElementType a,StackElementType op,StackElementType b)
{
    int a_num,b_num,result_num;
    StackElementType result;
    a_num=(int)a;
    b_num=(int)b;
    switch(op)
    {
        case '+':result_num=a_num+b_num;break;
        case '-':result_num=a_num-b_num;break;
        case '*':result_num=a_num*b_num;break;
        case '/':result_num=a_num/b_num;break;
    }
    result=(StackElementType)result_num;
    return(result);
} 
//主函数
int main()
{
    SeqStack OVS,OPTR;
    InitStack(&OVS);
    InitStack(&OPTR);//初始化
    char ch,ch_temp,op,a,b,v;
    Push(&OPTR,'#');
    printf("\n\nPlease input an expression(Ending with #):");
    ch=getchar();
    GetTop(&OPTR,&ch_temp);
    while(ch!='#'||ch_temp!='#')
    {
        if(ch>='0'&&ch<='9')//不是操作符,是操作数 
        {
            int temp;
            temp=ch-'0';//先把当前操作数从字符转换成数字 
            ch=getchar();
            while(ch>='0'&&ch<='9')
            {
                temp=temp*10+ch-'0';
                ch=getchar();
            }
            Push(&OVS,temp);
        }
        else
        {
         GetTop(&OPTR,&ch_temp);
         switch(Compare(ch,ch_temp))
         {
            case '>':Push(&OPTR,ch);ch=getchar();break;
            case '=':Pop(&OPTR,&op);ch=getchar();break;
            case '<':Pop(&OPTR,&op);Pop(&OVS,&b);Pop(&OVS,&b);v=Execute(a,op,b);Push(&OVS,v);break;

         }
        }
        GetTop(&OVS,&v);
        return(0);


    }
    printf("the result is %d",(int)v);


} 


  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 素材场景中光线烘焙后灯光失效
    • ¥15 请教一下各位,为什么我这个没有实现模拟点击
    • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
    • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
    • ¥20 有关区间dp的问题求解
    • ¥15 多电路系统共用电源的串扰问题
    • ¥15 slam rangenet++配置
    • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
    • ¥15 ubuntu子系统密码忘记
    • ¥15 保护模式-系统加载-段寄存器