一道简单的符号匹配题。
主要是练练栈的一些应用。
1153
题目链接 http://ac.jobdu.com/problem.php?pid=1153
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <stack>
#define ISYEAP(x) x%100!=0 && x%4==0 || x%400==0 ? 1:0
#
using namespace std;
stack<int> sta;
int main()
{
char s[110];
int arr[110];
int length;
while(scanf("%s",s)!=EOF){
length=strlen(s);
for(int i=0;i<length;i++){
if(s[i]!='(' && s[i]!=')'){
arr[i]=0;
continue;
}
if(s[i]=='('){
sta.push(i);
continue;
}
if(s[i]==')'){
if(sta.empty()){
arr[i]=2;//无左括号与之匹配
}
else{
int position=sta.top();
sta.pop();
arr[position]=0;
arr[i]=0;
}
}
}
while(!sta.empty()){
int position=sta.top();
sta.pop();
arr[position]=3;
}
printf("%s\n",s);
for(int i=0;i<length;i++){
if(arr[i]==0){
printf(" ");
}
else if(arr[i]==2){
printf("?");
}
else{
printf("$");
}
}
printf("\n");
}
}
栈的一些操作:
头文件 <stack>
声明 stack<typeelement> sta;
入栈,如例:s.push(x);
出栈,如例:s.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素。
访问栈顶,如例:s.top();//只是取出栈顶元素,并不删除。
判断栈空,如例:s.empty(),当栈空时,返回true。
访问栈中的元素个数,如例:s.size()
小技巧:puts(s);等价于printf(“%s\n”,s):
1019
题目链接
http://ac.jobdu.com/problem.php?pid=1019
分两个栈,一个栈存数字,一个栈存运算符号
遍历算式,分别把数字和符号推到各自栈中,
一旦数字栈中有3个数字,则判断符号栈,看是否计算前两个数字,还是计算后两个数字
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <stack>
#define ISYEAP(x) x%100!=0 && x%4==0 || x%400==0 ? 1:0
using namespace std;
stack<char> character;//符号栈
stack<double> digit;//数字栈
double charToFloat(char *s){ //把字符型的数字改为真正的数字
// puts(s);
int len=strlen(s);
double theUnit;//个位数
int AfterThePoint=1;//小数点后几位
double num=0;
bool IfItIsPoint=false;//标记是否扫描到有小数点的存在
for(int i=0;i<len;i++){
if(s[i]=='.'){
IfItIsPoint=true;
continue;
}
theUnit=(float)(s[i]-'0');
if(IfItIsPoint==false){
num=num*10+theUnit;
}
else{
theUnit=theUnit/(10^AfterThePoint);
AfterThePoint++;
num+=theUnit;
}
}
// printf("NUM=%f\n",num);
return num;
}
int judgeWhichIsBigger(char first,char second){ //判断两个符号的大小
if(second=='+' || second=='-')
{
return 1;//表示第一个优先级大
}
if(first=='*' || first=='/'){
return 1;//表示第一个大
}
return 2;//表示第二个大
}
double calculate_calculatePart(double first,double second,char cha){
if(cha=='+')
return first+second;
if(cha=='-')
return first-second;
if(cha=='*')
return first*second;
if(cha=='/')
return first/second;
return 0;
}
void calculate(){
char firstCharacter,secondCharacter;
double theFirstNum,theSecondNum,thethirdNum;
//首先判断两个符号的优先级
// printf("符号数是 %d\n",character.size());
// printf("数字个数 %d\n",digit.size());
secondCharacter=character.top();
character.pop();
firstCharacter=character.top();
character.pop();
// printf("firstCharacter=%c secondCharacter=%c\n",firstCharacter,secondCharacter);
if(judgeWhichIsBigger(firstCharacter,secondCharacter)==1){//第一个符号大
thethirdNum=digit.top();
digit.pop();
theSecondNum=digit.top();
digit.pop();
theFirstNum=digit.top();
digit.pop();
theFirstNum=calculate_calculatePart(theFirstNum,theSecondNum,firstCharacter);
theSecondNum=thethirdNum;
digit.push(theFirstNum);
digit.push(theSecondNum);
character.push(secondCharacter);
}
else{
theSecondNum=digit.top();
digit.pop();
theFirstNum=digit.top();
digit.pop();
theFirstNum=calculate_calculatePart(theFirstNum,theSecondNum,secondCharacter);
digit.push(theFirstNum);
character.push(firstCharacter);
}
}
void putTheNum(double num){
digit.push(num);
// printf("bbbbb\n");
if(digit.size()==3){
// printf("cccccc\n");
calculate();
// printf("ddddd\n");
}
}
bool judgeCharacter(char c){
if(c=='+' || c=='-' || c=='*' || c=='/')
return true;
return false;
}
void divide(char* s){
char arr[210];
int lenth=strlen(s);
int theLengthOfAFigure=0;
for(int i=0;i<lenth;i++){
if(s[i]==' '){
theLengthOfAFigure=0;
float temp=charToFloat(arr);
putTheNum(temp); //数字进栈
arr[0]='\0';
// printf("aaaaa\n");
continue;
}
if(judgeCharacter(s[i])){
character.push(s[i]);//符号进栈
// printf("%c\n",s[i]);
i++;
}
else{
arr[theLengthOfAFigure]=s[i];
theLengthOfAFigure++;
arr[theLengthOfAFigure]='\0';
}
}
double temp=charToFloat(arr);
putTheNum(temp);//把最后一个数字进栈。
if(digit.size()==2){
double thesecond=digit.top();
digit.pop();
double thefirst=digit.top();
digit.pop();
double answer=calculate_calculatePart(thefirst,thesecond,character.top());
digit.push(answer);
}
printf("%.2f\n",digit.top());
while(!digit.empty()){
digit.pop();
}
while(!character.empty()){
character.pop();
}
}
int main(){
char s[210];
while(gets(s)){
if(strcmp(s,"0")==0)
return 0;
divide(s);
}
}
/**************************************************************
Problem: 1019
User: zhouyudut
Language: C++
Result: Accepted
Time:0 ms
Memory:1528 kb
****************************************************************/