⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intcalculate.cpp

📁 以字符形式从终端输入语法正确的
💻 CPP
字号:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define IS 100                          //定义栈的初始分配量
#define C 10                            //定义栈的分配增量
typedef struct{
	int *base;                          //栈底指针
	int *top;                           //栈顶指针
	int stacksize;                      //当前已分配的存储空间
}sqstack; 
//=========================================================================== 
void Initstack(sqstack *s){
       //构造一个空栈S
	s->base=(int *)malloc(IS*sizeof(int));
	if(!s->base)exit(-1);                   //若栈初始化存储分配失败,退出程序
	s->top=s->base;
	s->stacksize=IS;
}
//============================================================================
int Gettop(sqstack *s){
       //若栈不空,则返回S的栈顶元素的值
	if(s->top==s->base) return 0;
	return(*(s->top-1));
}
//============================================================================
void push(sqstack *s,int e){
	   //插入元素e为新的栈顶元素
	if(s->top-s->base>=s->stacksize){        //栈满,追加存储空间
		s->base=(int *)realloc(s->base,(s->stacksize+C)*sizeof(int));
		if(!s->base)exit(-1);                 //若追加存储空间失败,退出程序
		s->top=s->base+s->stacksize;           //修改栈顶指针
		s->stacksize+=C;                      //修改当前已分配存储空间  
	}
	*s->top++=e;
}
//============================================================================
int  pop(sqstack *s){
           //若栈不空,则删除S的栈顶元素,并返回其值
		if(s->top==s->base){
		printf("栈为空,删除栈顶元素失败!\n");
		exit(1);                        //若栈为空,告知使用者并退出程序
	}//if 
		return(*--s->top);
	}
//=============================================================================
int In(char c){
         //此函数起到判断a是否为运算符的作用
		 //如果a为数字,则返回0,代表其不是运算符
		if(c=='+') return 1;
		if(c=='-') return 1;
		if(c=='*') return 1;
		if(c=='/') return 1;
		if(c=='(') return 1;
		if(c==')') return 1;
		if(c=='#') return 1;
		return 0;
	}
//==============================================================================
int Operate(int a,char theta,int b){
         //计算表达式a theta b(theta代表运算符),并返回其值
		if(theta=='+')return(a+b);
		if(theta=='-')return(a-b);
		if(theta=='/'){
			if(b==0){
					printf("除数为0,输入错误!\n");    //当除数为0时,告知使用者并退出程序
					exit(-1);
			}
		else return(a/b);
		}
		if(theta=='*')return(a*b);
		else return 0;                                 //当两数字之间的运算符输入错误(不是+,-,*,/),退出程序
	}
	char  Precede(char g,char c){
            //判断运算符a和b的优先级
		switch(g){
		case'(':if(c==')')return'=';
			else return('<');
		case'#':return('<');
		case')':return('>');
		case'+':
		case'-':if(c=='*'||c=='/'||c=='(')
					return ('<');
			else return('>');		
		case'*':
		case'/':
			if(c=='(')return('<');
			else return('>');		
		default:{
			printf("输入错误!");
			exit(-1);
				}
		}
	}  
   //=================================================================================
void Destroy(sqstack *S){
    //销毁栈
	free(S->base);
}//Destroy

	sqstack OPTR,OPND;                     //定义全局运算符栈OPTR和操作数栈OPND
	//=================================================================================
void main(){		
			char c,theta;
			int a,b,temp=0;
			Initstack(&OPTR);               //初始化运算符栈
			push(&OPTR,'#');                //令表达式起始符'#'入栈
			Initstack(&OPND);               //初始化操作数栈
            printf("本程序为简单算术表达式求值程序,欢迎使用!\n");
			printf("******************************************************************************\n");
			printf("请输入正确的整数表达式,结束请输入‘#’:\n");
			c=getchar();
			while((c!='\n')&&(c!='#'||Gettop(&OPTR)!='#')){
				if(!In(c)){
				while(In(c)==0){
				temp=temp*10+c-'0';
				c=getchar();
			}//while
			push(&OPND,temp);
			temp=0;
				}//if    //不是运算符进操作数栈
				else
					switch(Precede(Gettop(&OPTR),c)){
		case'<':          //栈顶元素优先级低
			push(&OPTR,c);c=getchar();
			break;
		case'=':            //脱括号并接收下一字符
			pop(&OPTR);c=getchar();
			break;
		case'>':              //退栈并将运算结果入栈
			theta=pop(&OPTR);
				(int) a=pop(&OPND);(int) b=pop(&OPND);
				push(&OPND,Operate(b,theta,a));
				break;
				}
			}
				printf("结果是:%-5d\n",Gettop(&OPND));
			Destroy(&OPTR);
	        Destroy(&OPND);
			}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -