后缀表达式


1.后缀表达式的计算

#include<stdio.h>
#include<string.h>
#define N 100000
long long a[N];
int main()
{
	long long sum=0,j=0,i;
	int n,cnt=0,flag,sign=1;
	char str[30000];
	scanf("%d",&n);
	getchar();
	scanf("%s",str);
	for(i=0;i<strlen(str);i++)
	{
		if(str[i]>='0'&&str[i]<='9')
		{
			sum*=10;sum=sum+str[i]-'0';
			sum*=sign;flag=1;
			sign=1;
			//printf("sum=%d\n",sum);
		}
		if(str[i+1]>='0'&&str[i+1]<='9'&&str[i]=='-')
		{
			sign=-1;
			//printf("sum=%d\n",sum);
		}
		if(str[i]==','&&flag==1)
		{
			j++;
			a[j]=sum;
			sum=0;
			//printf("a[%d] =%d\n",j,a[j]);
		}
		if(str[i]=='+')
		{
			a[j-1]=a[j-1]+a[j];
			a[j]=0;j--;
			flag=0;
			//printf("a[%d]=%d\n",j,a[j]);
		}
		if(str[i]=='-'&&(!(str[i+1]>='0'&&str[i+1]<='9')))
		{
			a[j-1]=a[j-1]-a[j];
			a[j]=0;j--;
			flag=0;
			//printf("a[%d]=%d\n",j,a[j]);
		}
		if(str[i]=='*')
		{
			a[j-1]=a[j-1]*a[j];
			a[j]=0;j--;
			flag=0;
			//printf("a[%d]=%d\n",j,a[j]);
		}
		if(str[i]=='/')
		{
			a[j-1]=a[j-1]/a[j];
			a[j]=0;j--;
			flag=0;
			//printf("a[%d]=%d\n",j,a[j]);
		}
	}
	printf("%lld",a[1]);
	return 0;
}

#include<stdio.h> 
#include<string.h> 
#define N 1000000
long long a[N];
int main()
{
	int i,sign=1,j=0,flag=1;
	long long s=0;
	char str[30000];
	scanf("%s",str);
	for(i=0;i<strlen(str);i++)
	{
		if(str[i]>='0'&&str[i]<='9')//正数 
		{
			s*=10;s=s+str[i]-'0';
			//s*=sign;sign=1;
			flag=1;
		}
		/*if(str[i+1]>='0'&&str[i+1]<='9'&&str[i]=='-')//负数
		{
			sign=-1;
		 } */
		if(str[i]=='.'&&flag==1)
		{
			j++;//保证后面不会多加 
			a[j]=s;
			s=0;
		}
		if(str[i]=='+')
		{
			a[j-1]=a[j]+a[j-1];
			j--;
			flag=0;
		 } 
		 if(str[i]=='-')
		 {
		 	a[j-1]=a[j-1]-a[j];
			j--;
			flag=0;
		 }
		 if(str[i]=='*')
		 {
		 	a[j-1]=a[j-1]*a[j];
		 	j--;
		 	flag=0;
		 }
		 if(str[i]=='/')
		 {
		 	a[j-1]=a[j-1]/a[j];
		 	j--;
		 	flag=0;
		 }
	 } 
	printf("%lld",a[1]);
	return 0;
}

以上两题均为后缀表达式的计算,第一题来自PTA的上机作业,第二题来自洛谷

虽然题目相似,但是第二题由于在运算符后面没有.所以不需要考虑负数的情况

2.改为后缀表达式

/*
s.push(item); //将item压入栈顶
s.pop(); //删除栈顶的元素,但不会返回
s.top(); //返回栈顶的元素,但不会删除
s.size(); //返回栈中元素的个数
s.empty(); //检查栈是否为空,如果为空返回true,否则返回false
*/
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
int judge(char ch)
{
	if(ch=='+'||ch=='-') return 1;
	else if(ch=='*'||ch=='/') return 2;
	else if(ch=='(') return 0;
	else if(ch==')') return -1;
}
int main()
{
	char s[1001];
	stack<char>ssign;
	scanf("%s",s);
	//printf("%d\n",strlen(s));
	for(int i=0;i<strlen(s);i++)
	{
		//printf(" i=%d  ",i);
		if(s[i]>='0'&&s[i]<='9')//操作数直接输出 
			printf("%c",s[i]);
		else 
		{
			if(judge(s[i])==1||judge(s[i])==2)//普通运算符
			{
				while(!ssign.empty()&&(judge(ssign.top())>=judge(s[i])))//栈非空且栈顶元素优先级 ≥当前元素 
				{
					printf("%c",ssign.top());
					ssign.pop(); 
				}
				ssign.push(s[i]);
				//printf(":%c\n",ssign.top());
			 } 
			if(s[i]=='(')//左括号直接入栈
			{
				ssign.push(s[i]);
			}
			if(s[i]==')')//右括号
			{
				while(1)
				{
					if(ssign.top()=='(') break;//遇到左括号出栈
					printf("%c",ssign.top());
					ssign.pop();
				}
				ssign.pop();//左括号出栈 
			} 
		}
	}
	while(!ssign.empty())
	{
		printf("%c",ssign.top());
		ssign.pop();
	}
	return 0;
} 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM