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

📄 合体.cpp

📁 一个不错的逆波兰式 解释如何利用 逆波兰式 把 中序表达式 装进一个 队列 或者堆栈 里面
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>


	struct stack
	{
		int top;
	    char element[20];
	};
	typedef struct stack Stack;


void Push(Stack *s, char element)
{

		s->top++;
		s->element[s->top] = element;
	
}


int icp(char c)                    //比较进栈优先级
{
	switch(c)
	{
	case'^':
		return(3);
	case'/':
	case'*':
		return(2);
	case'+':
	case'-':
		return(1);
	}
}


int isp(char c)                  //比较临时栈顶优先级
{
	switch(c)
	{
	case'^':
		return(3);
	case'/':
	case'*':
		return(2);
	case'+':
	case'-':
		return(1);
	case('('):
		return(0);
	case(';'):
		return(-1);
	}
}

void mid_to_pos(char mid_exp[],struct stack * pos_exp)
{
    void Push(Stack * s, char element);
	int isp(char c);
	int icp(char c);
	char stack[20],c;                       //定义临时栈
	int i,j;
	i=0;
	j=0;
	stack[0]=';';



	c=mid_exp[j];                                    //扫描表达式
	while(c!='\0')
	{
		if(c<='9'&&c>='0')
		{
			Push(pos_exp,c);
			if(mid_exp[j+1]>'9'||mid_exp[j+1]<'0')
			{
				Push(pos_exp,' ');
			}
		}
		else
			switch(c)
		{
			case('('):
				i=i+1;
				stack[i]=c;

				break;
			case('^'):
			case('*'):
			case('/'):
            case('+'):
	        case('-'):
				while(icp(c)<=isp(stack[i]))
				{
					Push(pos_exp,stack[i]);
					i=i-1;
				}
                i=i+1;
                stack[i]=c;
				break;
			case')':
				while(stack[i]!='(')
				{
					Push(pos_exp,stack[i]);
					i=i-1;
				}
				i=i-1;
				break;
			default:
				printf("确认输入的是正确的中缀式!!!") ;               //表达式有误
		}
		j=j+1;
		c=mid_exp[j];
	}
	while(i>=1)
	{
	Push(pos_exp,stack[i]);
	i=i-1;
	}
	Push(pos_exp,'\0');//**********************
}





void compvale(struct stack * pos_exp,int * p_x)
{
char c;
int j,i,k;
int x;
int sum_temp;            //把字符串转为数值
int sum[20];              //存放已经转换的数值
char temp[10];
++pos_exp->top;
j=0;
k=-1;
c=(pos_exp)->element[pos_exp->top];          
while(c!='\0')
{
	if(c<='9'&&c>='0')
	{
		temp[j]=c;
		++j;
		sum_temp=0;
		if(pos_exp->element[pos_exp->top+1]==' ')
		{
			for(i=0;i<j;++i)
			{
				sum_temp+=(temp[i]-48)*(int)pow(10,(j-1-i));         //把字符串转为int
			}
			j=0;
			++k;
			sum[k]=sum_temp;
            ++pos_exp->top;
		}
	}
	else
		switch(c)
	{
		case('+'):
			x=sum[k--];
			sum[k]+=x;
			break;
		case('-'):
			x=sum[k--];
			sum[k]-=x;
			break;
		case('*'):
			x=sum[k--];
			sum[k]*=x;
			break;
		case('/'):
			x=sum[k--];
			sum[k]/=x;
			break;
		case('^'):
			x=sum[k--];
			sum[k]=(int)pow(sum[k],x);
			break;
		default:
			printf("计算失败!!!");
	}
	c=pos_exp->element[++pos_exp->top];
}
*p_x=sum[0];
}



void main()
{
	
	struct stack pos_exp;
	pos_exp.top=-1;
    int i;

	char mid_exp[30];
	printf("input an expression:\n");
	scanf("%s",mid_exp);




    mid_to_pos(mid_exp,&pos_exp);
    
	for(i=0;i<=pos_exp.top;++i)
		printf("%c",pos_exp.element[i]);




    pos_exp.top=-1;
	int a;
	compvale(&pos_exp,&a);
	printf("%d",a);



}

⌨️ 快捷键说明

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