南阳oj 郁闷的c小加(一) 题目257
2015-08-01 15:43
337 查看
#include<stdio.h>
#include <string.h>
#include <stack>
#define N 1000
using namespace std;
stack<char> op;//定义保存运算符的栈
char s1
,s2
;
int priority(char ch)//定义运算符的优先级
{
int num;
switch(ch)
{
case '+':
case '-':return 1;
case '*':
case '/':return 2;
case '(':
case ')':return 0;
default:return -1;
}
}
int main()//将中缀表达式转换为后缀表达式
{
int T;
scanf("%d",&T);
op.push('#');
while(T--)
{
scanf("%s",s1);
int k=strlen(s1);
int top=-1;
for(int i=0;i<k;i++)
{
if(s1[i]>='0'&&s1[i]<='9')
{//当是数字的时候
top++;
s2[top]=s1[i];
}
else if(s1[i]=='+'||s1[i]=='-'||s1[i]=='*'||s1[i]=='/')
{ //如果当前的操作符比栈顶的操作符优先级大的话,则将当前操作符进栈
if(priority(s1[i])>priority(op.top())) op.push(s1[i]);
else
{ //当前运算符优先级小,则将栈中运算符优先级大于等于当前的都从栈出来
while(priority(op.top())>=priority(s1[i]))
{
top++;
s2[top]=op.top();//将栈顶的运算符出栈
op.pop();
}
op.push(s1[i]);//然后再把当前的运算符进栈
}
}
else if(s1[i]=='(') op.push(s1[i]);
else if(s1[i]==')')
{
while(op.top()!='(')
{
top++;
s2[top]=op.top();
op.pop();
}
op.pop();//将左括号删除
}
}
while(op.top()!='#')//如果此时符号栈仍不为空则全部出栈
{
top++;
s2[top]=op.top();
op.pop();
}
for(int i=0;i<=top;i++)
{
printf("%c",s2[i]);
}
printf("\n");
}
return 0;
}
#include<stdio.h>
#include <string.h>
#include <stack>
#define N 1000
using namespace std;
stack<char> op;//定义保存运算符的栈
char s1
,s2
;
int priority(char ch)//定义运算符的优先级
{
int num;
switch(ch)
{
case '+':
case '-':return 1;
case '*':
case '/':return 2;
case '(':
case ')':return 0;
default:return -1;
}
}
int main()//将中缀表达式转换为后缀表达式
{
int T;
scanf("%d",&T);
op.push('#');
while(T--)
{
scanf("%s",s1);
int k=strlen(s1);
int top=-1;
for(int i=0;i<k;i++)
{
if(s1[i]>='0'&&s1[i]<='9')
{//当是数字的时候
top++;
s2[top]=s1[i];
}
else if(s1[i]=='+'||s1[i]=='-'||s1[i]=='*'||s1[i]=='/')
{ //如果当前的操作符比栈顶的操作符优先级大的话,则将当前操作符进栈
if(priority(s1[i])>priority(op.top())) op.push(s1[i]);
else
{ //当前运算符优先级小,则将栈中运算符优先级大于等于当前的都从栈出来
while(priority(op.top())>=priority(s1[i]))
{
top++;
s2[top]=op.top();//将栈顶的运算符出栈
op.pop();
}
op.push(s1[i]);//然后再把当前的运算符进栈
}
}
else if(s1[i]=='(') op.push(s1[i]);
else if(s1[i]==')')
{
while(op.top()!='(')
{
top++;
s2[top]=op.top();
op.pop();
}
op.pop();//将左括号删除
}
}
while(op.top()!='#')//如果此时符号栈仍不为空则全部出栈
{
top++;
s2[top]=op.top();
op.pop();
}
for(int i=0;i<=top;i++)
{
printf("%c",s2[i]);
}
printf("\n");
}
return 0;
}
相关文章推荐
- R语言:k近邻
- 【NOIP2006】金明的预算方案
- 异常
- pdfFactory Pro 不能被安装(AddPrinterDriver 失败)...找不到指定的模块
- 编程修养(五)
- 通过位置找到ListView中的某个item的View
- mysql存储过程之游标遍历数据表
- margin外边距问题
- Swing 中各种提示框的工具类
- webstrom 安装教程 配置js调试
- 【练习笔记】剑指offer-面试题7 :用两个栈实现队列
- JS 解析JSON
- Single Number(找出只出现了一次的数,其它数都出现两次)
- c# ConcurrentQueue
- [odroid-pc] ubuntu12.04 安装jdk-6u45-linux-x64.bin
- HDU5313——DP+vector——Bipartite Graph
- qt学习第四课:子类化窗口
- java之ArrayList的toArray方法
- centos6.5下postgres-XC集群安装与配置
- zookeeper无法正常启动问题