题目地址:http://acm.sgu.ru/problem.php?contest=0&problem=340
源代码:
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <queue>
#include <map>
#include <vector>
#include <bitset>
#include <cmath>
#include <set>
#include <stack>
using namespace std;
char s[1000005];
stack<char>st; //栈,用于{}的匹配问题。
bool is_letter(char x)
{
if(x>='A'&&x<='Z')
return true;
if(x>='a'&&x<='z')
return true;
return false;
}
bool is_operator(char x)
{
if(x=='+'||x=='-'||x=='*'||x=='/')
return true;
return false;
}
bool is_digit(char x)
{
return x>='0'&&x<='9';
}
int main()
{
int i,j,k;
while(gets(s))
{
int len=strlen(s);
int now=0,cc=0;
while(!st.empty()) //清空栈
st.pop();
while(now<len&&cc<2)
{
char x=s[now++];
if(cc==0&&x!='$') //因为题中说了是以$为开始。。
continue;
if(x=='$')
{
cc++;
continue;
}
if(x==' ')
continue;
if(is_letter(x))
{
printf("<i>%c",x);
while(now<len&&(is_letter(s[now])||s[now]==' '))
{
if(s[now]!=' ')
printf("%c",s[now]);
now++;
}
printf("</i>");
continue;
}
if(is_digit(x))
{
printf("%c",x);
continue;
}
if(is_operator(x))
{
printf(" %c ",x);
continue;
}
if(x=='('||x==')')
{
printf("%c",x);
continue;
}
if(x=='}')
{
if(!st.empty())
{
if(st.top()=='^')
printf("</sup>");
else
printf("</sub>");
st.pop();
}
continue;
}
if(x=='{')
continue;
if(x=='^')
{
st.push('^');
printf("<sup>");
while(now<len&&s[now]==' ')
now++;
if(s[now]!='{')
{
if(is_letter(s[now]))
printf("<i>%c</i></sup>",s[now++]);
else if(is_operator(s[now]))
printf(" %c </sup>",s[now++]);
else if(is_digit(s[now]))
printf("%c</sup>",s[now++]);;
st.pop();
}
continue;
}
if(x=='_')
{
st.push('_');
printf("<sub>");
while(now<len&&s[now]==' ')
now++;
if(s[now]!='{')
{
if(is_letter(s[now]))
printf("<i>%c</i></sub>",s[now++]);
else if(is_operator(s[now]))
printf(" %c </sub>",s[now++]);
else if(is_digit(s[now]))
printf("%c</sub>",s[now++]);
st.pop();
}
continue;
}
}
puts("");
}
return 0;
}