回 帖 发 新 帖 刷新版面

主题:请高手帮忙解读一下这个程序,谢谢

[size=6][size=4]这个程序是老师留的“栈”输出,但我看不懂他是怎么输出的,请帮忙讲讲各个算法实现的源程序,说明每个部分的算法设计说明,每个程序中使用的存储结构设计说明[/size][/size]




#include<stdio.h>
#include<stdlib.h>
#define STACKSIZE 20
#define FALSE 0
#define TRUE 1

//定义字符栈SqStack1,保存运算符
typedef struct
{
    int  top;
    char  elem[STACKSIZE];
}SeqStack1;
void InitStack1 (SeqStack1 &S)
{
     // 构造一个最大空间为 maxsize 的空顺序栈 S   
   S.top = -1; 
}
char GetTop1(SeqStack1 &S)
{/* 将栈S的栈顶元素弹出, 放到x所指的存储空间中, 但栈顶指针保持不变 */
     if(S.top==-1)   /*栈为空*/
       printf("栈1为空");
     else
        return(S.elem[S.top]);
}
int Push1(SeqStack1 &S,char x)
{
  if(S.top== STACKSIZE)  
    return (FALSE);/*栈已满*/
  S.top++;
  S.elem[S.top]=x;
  return(TRUE);

int Pop1(SeqStack1 &S, char *x)
{  /* 将栈S的栈顶元素弹出, 放到x所指的存储空间中 */
   if(S.top==-1)   /*栈为空*/
       return(FALSE);
   else
   {
       *x= S.elem[S.top];
       S.top--;     /* 修改栈顶指针 */
       return(TRUE); 
    }


//定义整数栈SqStack2,保存操作数 
typedef struct
{
    int  top;
    int  elem[STACKSIZE];
}SeqStack2;

void InitStack2 (SeqStack2 &S)
{
     // 构造一个最大空间为 maxsize 的空顺序栈 S   
   S.top = -1; 
}
int GetTop2(SeqStack2 &S)
{/* 将栈S的栈顶元素弹出, 放到x所指的存储空间中, 但栈顶指针保持不变 */
     if(S.top==-1)   /*栈为空*/
               printf("栈2为空");
     else
        return(S.elem[S.top]);
}
int Push2(SeqStack2 &S,int x)
{
  if(S.top== STACKSIZE)  
    return (FALSE);/*栈已满*/
  S.top++;
  S.elem[S.top]=x;
  return(TRUE);

int Pop2(SeqStack2 &S, int *x)
{  /* 将栈S的栈顶元素弹出, 放到x所指的存储空间中 */
   if(S.top==-1)   /*栈为空*/
       return(FALSE);
   else
   {
       *x= S.elem[S.top];
       S.top--;     /* 修改栈顶指针 */
       return(TRUE); 
    }


int Precede(char c1,char c2)//不考虑括号运算符 
{
    switch(c1)
    {
              case'+':
              case'-':if(c2=='+' ||c2=='-' ||c2=='#')
                            return 1;
                      else 
                            return -1;
                      break;
              case'*':
              case'/':
                      return 1;
                      break;
              
              case'#':if(c2=='#')
                            return 0;
                      else
                            return -1;
                      break;
                      
    }
}
int EvaluateExpression()
{
    SeqStack1 OPTR;//运算符栈
    SeqStack2 OPND;//运算数栈
    
    char c;
    int n;
    char theta; 
    int a,b;
    char x;
    int abexpress;
    
    InitStack1(OPTR);
    Push1(OPTR,'#');
    InitStack2(OPND);
    c=getchar();
   
    
    while(c!='#' || GetTop1(OPTR)!='#')
    {
                 if(c!='+' && c!='-' && c!='*' && c!='/' && c!='#' )
                 {
                           n=c-'0'; //将接收进来的字符转换成数字后入栈 
                           
                           Push2(OPND,n);
                           c=getchar();
                          
                 }
                 else
                   switch(Precede( GetTop1(OPTR),c ))
                   {
                       case -1:
                            Push1(OPTR,c);
                            c=getchar();
                            break;
                      
                       case 1:Pop1(OPTR,&theta);
                              Pop2(OPND,&b);
                              Pop2(OPND,&a);
                              switch(theta)
                              {
                                     case'+':abexpress=a+b;break;
                                     case'-':abexpress=a-b;break;
                                     case'*':abexpress=a*b;break;
                                     case'/':abexpress=a/b;break;
                               }
                              Push2(OPND,abexpress);
                              break;
                   }
    }
    return GetTop2(OPND);
    
}
int main()
{
   
    printf("请输入表达式,以#号结尾:");
    printf("abexpress=%d",EvaluateExpression());
    system("pause"); 
    return 0;
}

回复列表 (共3个回复)

沙发

楼主您应该具体说一下是哪一句或哪几句不懂,笼统的来一个“帮忙解读一下这个程序”真的很难回答。

板凳

太长了!!!
提问题应该有技巧的,除非不想得到答案.

3 楼


沙井PLC培训  沙井触摸屏培训  沙井伺服电机培训  沙井变频器培训 
深圳三菱工控技术培训中心,是珠三角地区最专业的系统性PLC培训机构,也是国内自动化技术实操教学的先行者。采用工程案例教学模式:由三菱华南技术总监做讲师+系统理论+工程案例+实操指导,以工程的案例授课。人手一台电脑、一套实验设备,20%理论知识+80%上机实际操作、采用“手把手”教学方式,以确保学员的学习效果和质量。本中心承诺:包学会,免费推荐工作,一期不会,下期免费再学!学会为止。
本中心长期承接台资、日资等外资公司企业内训,同时接受大型工厂定向培训。企业定制培训课程,针对性更强,教学方式灵活,培训效果更好。企业定向培训,费用相对优惠。培训地点可在委托企业内进行,也可在本中心进行。相关事宜双方友好协商。
详细课程内容,登陆三菱培训网查询或亲临上课地点免费试听。

深圳三菱工控技术培训中心
西乡校区:宝安西乡流塘路口好运来商务大厦B座5003
沙井校区:沙井电子城旁海正电脑城8楼811   
咨询电话:  西乡:0755-29127550   沙井:0755-86369202
报名联系:  陈老师 13267152530  QQ:593140788
技术支持:  刘老师 13538089519  QQ:574275831

我来回复

您尚未登录,请登录后再回复。点此登录或注册