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 安卓adb backup备份应用数据失败
    • ¥15 eclipse运行项目时遇到的问题
    • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
    • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
    • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
    • ¥50 成都蓉城足球俱乐部小程序抢票
    • ¥15 yolov7训练自己的数据集
    • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
    • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
    • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)