虚拟OJ 栈和队列专题中的H题
想的和栈其实没太大关系,主要是用数组实现的,将题目所给的中缀式转换为后缀式 再用数组输出
从手工操作 求大神优化
Description

 从键盘上输入一个逆波兰表达式,用伪码写出其求值程序。规定:逆波兰表达式的长度不超过一行,以@符作为输入结束,操作数之间用空格分隔,操作符只可能有+、-、*、/四种运算。例如:
请输入一个以'@'字符结束的中缀算术表达式:
12+(3*(20/4)-8)*6@
对应的后缀算术表达式为:
12 3 20 4 /*8 -6 *+@
求值结果为:54

 Input

 输入:
12+(3*(20/4)-8)*6@

 Output


输出:
54
 Sample Input

 

12+(3*(20/4)-8)*6@ 

 


FAQ | About Virtual Judge | Forum | Contact | Open Source Project

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 200
	int main()
	{
		char a[1000],b[1000]={0},c[1000]={0};
		int i,j,k,d[100],m,f,shu[100];
		j=0;
		k=1;
		m=0;
		c[0]='(';
		gets(a);
		for(i=0;a[i]!='@';i++)
		{
			if(a[i]>=48&&a[i]<=57)
			{
				if(a[i+1]>=48&&a[i+1]<=57)
				{
					b[j]=a[i];
					j++;
				}
				else
				{
					b[j]=a[i];
					b[j+1]=' ';
					j+=2;
				}
			}
			if(a[i]=='(')
			{
				c[k]=a[i];
				d[m]=k;
				m++;
				k++;
				continue;
			}
			if(a[i]=='*'||a[i]=='/')
			{
				c[k]=a[i];
				k++;
				continue;
			}
			if(a[i]==')')
			{
				b[j]=c[k-1];
				j++;
				c[k]='\0';
				k--;
				c[d[m-1]]='\0';
				continue;
			}
			if(a[i]=='+'||a[i]=='-')
			{
				for(f=k;c[f-1]=='\0';f--)
				{
				}
				if(c[f-1]=='*'||c[f-1]=='/')
				{
					b[j]=c[f-1];
					c[f-1]=a[i];
					j++;
					k=f;
				}
				else
				{
					c[k]=a[i];
					k++;
				}
				continue;
			}
		}

		k=strlen(c);
		for(i=k-1;i>=0;i--)
		{
			if(c[i]=='+'||c[i]=='-'||c[i]=='*'||c[i]=='/')
			{
				b[j]=c[i];
				j++;
			}
		}
		b[j]='@';
			j=0;
		for(i=0;b[i]!='@';i++)
		{
				if(b[i]>=48&&b[i]<=57)
			{
				if(b[i+1]>=48&&b[i+1]<=57)
				{
					shu[j]=(b[i]-48)*10+b[i+1]-48;
					j++;
					i++;
					continue;
				}
				else
				{
					shu[j]=b[i]-48;
				j++;
				continue;
				}
			}
				if(b[i]=='+')
				{
					shu[j-2]=shu[j-1]+shu[j-2];
					j--;
					continue;
				}
				if(b[i]=='-')
				{
					shu[j-2]=shu[j-2]-shu[j-1];
					j--;
					continue;
				}
				if(b[i]=='*')
				{
					shu[j-2]=shu[j-2]*shu[j-1];
					j--;
				}
				if(b[i]=='/')
				{
					shu[j-2]=shu[j-2]/shu[j-1];
					j--;
					continue;
				}
		}
		printf("%d",shu[0]);
		return 0;
}

发表评论

电子邮件地址不会被公开。

Post Navigation