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;
}