| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1098 人关注过本帖
标题:小弟初来乍到,向各路高手致敬
只看楼主 加入收藏
C的温柔
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2020-5-18
收藏
 问题点数:0 回复次数:0 
小弟初来乍到,向各路高手致敬
栈的表达式计算
大佬们这个程序怎么改进啊,改进一点点就行啊,谢谢


#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 100
//此程序中存储单元采用malloc( )函数分配,但没有涉及处理溢出的问题,相关涉及可以参//照realloc( )的使用方法
//顺序栈的存储定义
typedef struct stack
{   
 char *base;//栈底指针
 char *top;//栈顶指针
 int stacksize;//栈分配的存储空间大小
}SqStack;

typedef struct stack2
{   
 int *base;//栈底指针
 int *top;//栈顶指针
 int stacksize;//栈分配的存储空间大小
}SqStack2;


void Menu();   
void trans(char str[],char rpn[]);
int value(char rpn[]);
int Match(char *p);
//*****************************************************************************
void Menu()
{//界面函数
 printf("*********表达式求值(只能包含+、-、*、/、()和正整数)********* ******\n");
 printf("请选择:1.输入表达式 2.括号匹配检查 3.转换后缀表达式 4.表达式计算5.退出\n");
}

//*****************************************************************************
int Match(char *p)
{//检查表达式中小括号是否匹配
 int flag=0;
 SqStack s;

 s.base=s.top=(char*)malloc(MAXSIZE*sizeof(char));
 if(!s.base) exit(-2);
 s.stacksize=MAXSIZE;
 
 while(*p!='\0')
 {
    if(*p== '(')
    {  if(s.top-s.base ==s.stacksize) exit(-1);
       else {*s.top=*p;
              s.top++;//将所有的左括号入栈
       }
    }
    if(*p== ')')
    { if(s.top!=s.base&&*(s.top-1)=='(') {
           s.top--;
           flag=1; }
     else flag=2;}
    p++;
 }//while
 if((flag==1||flag==0)&&s.top==s.base)
 {s.top=s.base;//将栈清空
  return 1;}
 else if(flag==2) {s.top=s.base;//将栈清空
                   return 0;}
 }//Match   
//*****************************************************************************
void trans(char str[],char rpn[])
{//将中缀表达式转换为后缀表达式
 char ch;
 int i=0,t=0;
 SqStack s1,s2;
 
 s1.base=s1.top=(char *)malloc(MAXSIZE*sizeof(char));
 if(s1.base==NULL) exit(-2);
 s2.base=s2.top=rpn;
 s1.stacksize=s2.stacksize=MAXSIZE;
 
 ch=str[i];
 i++;
 while(ch!='\0')
 { switch(ch)
     { case '(': *s1.top++=ch; break;
       case ')': while(*(s1.top-1)!='(')
                 { *(s2.top++)=*(s1.top-1);
                   s1.top--;
                   t++;
                 }
                 s1.top--;//此处必须再次进行--运算,才能忽略已经进入的'('
                 break;
       case '+':
       case '-':
                    while(s1.top!=s1.base && *(s1.top-1)!='(')
                    {*(s2.top++)=*(s1.top-1);
                     s1.top--;
                    }
                    *s1.top++=ch;
                    break;
       case '*':
       case '/':
                   while(*(s1.top-1)=='*'||*(s1.top-1)=='/')
                   {*(s2.top++)=*(s1.top-1);
                    s1.top--;
                   }
                   *s1.top++=ch;
                   break;
       case ' ':break;
       default:
                while(ch>='0'&&ch<='9')
                {*(s2.top++)=ch;
                 ch=str[i];
                 i++;
                }     
                i--;
                *(s2.top++)='#';         
      }//switch
 ch=str[i];
 i++;
 }//while
 while(s1.top!=s1.base)
 {*(s2.top++)=*(s1.top-1);
  t++;
  s1.top--;
 }//while
 *(s2.top++)='\0';
}//trans
//*****************************************************************************
int value(char rpn[ ])
{//后缀表达式求值
 int d;
 char ch;
 int t=0;
 SqStack2 st;//st用来存放数值
 
 st.base=st.top=(int *)malloc(MAXSIZE*sizeof(int));
 if(st.base==NULL) exit(-2);
 st.stacksize=MAXSIZE;   
 
 ch=rpn[t];
 while(ch!='\0')
 {
     switch(ch)
       {case '+':
                       *(st.top-2)=*(st.top-2) + *(st.top-1);
                       st.top--;
                       break;
        case '-':
                       *(st.top-2)=*(st.top-2) - *(st.top-1);
                       st.top--;
                       break;
        case '*':
                       *(st.top-2)=*(st.top-2) * *(st.top-1);
                       st.top--;
                       break;
        case '/':
                       if(*(st.top-1)!=0)
                         *(st.top-2)=*(st.top-2) / *(st.top-1);
                        else
                        {printf("\n除0错误!\n");
                         exit(0);
                        }
                    st.top--;
                       break;
        case '#':
                    t++;
                    break;               
        default:  
                     d=0;
                     while(ch>='0'&&ch<='9')
                       {
                       d=10*d+ch-'0';
                    t++;
                    ch=rpn[t];
                       }
                      *(st.top++)=d;
         }//switch
         t++;
         ch=rpn[t];
    }//while
    return *(st.top-1);
}//value
//*****************************************************************************
int main()
{//主函数
 char str[MAXSIZE],rpn[MAXSIZE],f;
 //str数组用来存储接收到的字符串,rpn用来存放转换出来的后缀表达式
 int i,j=0,g;
  Menu();
  while(1)
{
 scanf("%d",&g);
 switch(g)
 {
   case 1: printf("请输入表达式:");
           scanf("%s",str);
           break;
   case 2: i=Match(str);
           if(i==1) printf("匹配成功!\n");
           else printf("匹配失败!\n");
           break;
   case 3: if(i==1)
               {trans(str,rpn);
                printf("后缀表达式为:%s\n", rpn);
                j=1;}
           else
               {j=0;
                printf("表达式中括号匹配错误!\n");}
           break;
   case 4:
           if(j) printf("计算结果为:%d\n",value(rpn));
           else printf("后缀表达式转换遇到问题!\n");
           break;
   case 5: printf("确定要退出系统吗?(y/n)\n");
           getchar();f=getchar();
           if(f=='y'||f=='Y') exit(0);
           else {printf("请重新选择!\n");break;}
   default:printf("输入错误!\n");
           exit(1);
 }//switch
 }//while
  return 0;
}//main
搜索更多相关主题的帖子: char int base top case 
2020-05-18 09:39
快速回复:小弟初来乍到,向各路高手致敬
数据加载中...
 
   



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

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