栈的基本操作及其应用 表达式求值

本文介绍了一种使用栈实现的表达式求值算法,通过算符优先法处理包含加、减、乘、除等基本运算的数学表达式,并提供完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入一个表达式求结果

因为程序的限制数的大小有限制


#include<stdio.h>
#include<iostream> 
#include<cstdio>
#include<stdlib.h>  
#include<string.h>
#include<string>
using namespace std;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -1

typedef char SElemType;
typedef int Status;

typedef struct
{
	SElemType *base;  //栈底指针 
	SElemType *top;   //栈顶指针 
	int stacksize;   //栈可用最大容量 
}SqStack;

//构造一个空栈
Status InitStack (SqStack &S) 
{ 
	S.base = new SElemType[MAXSIZE];   //为顺序栈动态分配一个最大容量为MAXSIZE的数组空间 
	if(!S.base )  exit(OVERFLOW);      //存储分配失败 
	S.top=S.base ;                     // top初始base,空栈 
	S.stacksize = MAXSIZE;             //stacksize置为最大容量MAXSIZE 
	return OK;	
}

//入栈 
Status Push(SqStack &S,SElemType e)
{//插入新的栈顶元素 e 
 	if(S.base - S.top == S.stacksize )  return ERROR;   //栈空 
	*S.top ++ = e;                         //e压入栈列,栈顶指针加1 
	return OK;
} 

//出栈 
Status Pop(SqStack &S,SElemType &e)
{//插入新的栈顶元素 e 
 	if(S.base == S.top )  return ERROR;   //栈空 
	e = *--S.top;                         //栈顶指针减1 ,将栈顶元素赋给e 
	return OK;
}

//取栈顶元素 
SElemType GetTop(SqStack S)
{//插入新的栈顶元素 e  
 	if(S.base != S.top )    //栈非空 
	   return *(S.top - 1);    //返回栈顶元素,栈顶指针不变 
}

//In
int In(char x1)
{
	if( x1 =='(' || x1 ==')' || x1 =='+' || x1 =='-' || x1=='*' || x1=='/' || x1=='#')
	 return OK;
	else 
	 return ERROR;
} 

char Operate(char i, char th,char j)   //运算函数 
{
	char k;
	i = i -'0';
	j = j -'0';
	switch( th )
	{
		case '+':
			k = i+j+'0';
		case '-':
			k = i-j+'0';
		case '*':
			k = i*j+'0';
		case '/':
			k = i/j+'0';
	}
	return k;
}

char Precede( char a,char b)   //比较优先级 
{
	switch( a )   
	{
		case '+':
		  if( b == '+' || b == '-' || b == ')' || b == '#') 
		       return '>';
		  else if(b == '*' || b == '/' || b == '(')	
		       return '<';
		    break;
		 
		case '-':
		  if( b == '+' || b == '-' || b == ')'|| b == '#' ) 
		       return '>';
		  else if( b == '('|| b == '*' || b == '/' )	
		       return '<';
		   break;
		  	
		case '*':
	      if( b == '+' || b == '-' || b == ')'|| b == '#' || b == '*' || b == '/' )
		     return '>';
		  else if( b == '(')	
		     return '<';
		   break;
		  
		case '/':
		  if( b == '+' || b == '-' || b == ')'|| b == '#' || b == '*' || b == '/' )
		     return '>';
		  else if( b == '(')	
		     return '<';
		  break;
		  
		case '(':
		  if( b == ')')
		     return '=';
		  else if( b == '+' || b == '-' || b == '('|| b == '*' || b == '/')
		     return '<';
		  break;
		  
		case ')':
		  if( b == '+' || b == '-' || b == ')'|| b == '#' || b == '/' || b == '*')
		      return '>';	
		   break;
		  
		  
	    case '#':
	      if( b == '#')
	         return '=';
	      else if(b == '+' || b == '-' || b == '('|| b == '#' || b == '/' || b == '*')
		     return '<';
			break;	
	}
	
}

//表达式求值
char EvaluateExpersion()
{//算数表达式求值的算符优先算法,设OPTR和OPND分别为运算符栈和操作符栈 
    SElemType ch;
    SqStack OPTR;
    SqStack OPND;
     char x; 
    
	InitStack(OPTR);   //初始化OPTR栈 
	InitStack(OPND);   //初始化OPND栈 
	
    Push(OPTR,'#');    //将表达式起始符“# ”入OPTR栈 
    cin>>ch;
    
    char theta,a,b;
    
	while( ch!='#' || GetTop(OPTR) != '#' )    //表达式没有扫描完毕或者OPTR的栈顶元素不为“# ” 
	{
		if( !In(ch) )                      //ch不是运算符则进OPND栈 
		{
		  Push(OPND,ch);
		  cin>>ch;
		}
		else
		 switch( Precede( GetTop(OPTR),ch) )     //比较栈顶元素和ch的优先级 
		 {
		 	case '<':
		 		Push(OPTR,ch);                  //将当前字符压入OPTR栈,读入下一字符ch 
		 		cin>>ch;
		 		break;
		    case '>':
		    	Pop(OPTR,theta);               //弹出OPTR栈顶的运算符 
		    	Pop(OPND,b);                   //弹出OPTR栈顶的两个运算数 
		    	Pop(OPND,a);
		 		Push(OPND,Operate(a,theta,b));  //将运算结果压入OPND栈 
		 		break;
		    case '=':               //OPTR栈的栈顶元素是”(  ”且 ch是 “) ” 
		 	    Pop(OPTR , x);            // 弹出OPTR的栈顶的“( ” ,读入下一字符ch 
		 		cin>>ch;
		 		break;
		 }
	}
	return GetTop(OPND)-'0';          //OPND栈顶元素即表达式求值结果 
} 

int main()
{
	cout<<"表达式结果为:"<<EvaluateExpersion()<<endl;
	return 0;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值