-
这个代码是在上面的代码上改的,之前老师讲的都是没有考虑到前缀符号的问题,所以,,第四个测试点就过不了,第四个测试点 -2*(+3) -----------------> -2 3 *
-
只有两个改动的地方:
①如果符号在第一个位置,-要和数字连着,+不用输出(就不必判断了,这种情况就既不用入栈也不用输出)
②如果符号的前一个是(,同上 -
改动如下
对于+,没有入栈也没有输出,就是直接跳过了;
对于这两种情况下的-,就看成数字一起处理
while((isdigit(ss[i])||ss[i]=='.')||(i==0&&ss[i]=='-')||((ss[i]=='-')&&(ss[i-1]=='(')))
else if(((ss[i]=='+')||((ss[i]=='-')&&i!=0))&&ss[i-1]!='(')
开始的时候没有考虑(+3)这种情况不能输出+,就哈哈哈哈哈日常生活中哪有这样写的呀
- 遇到的小注意点
①最好不要if - if - if 这样,要if - else if这样
②isdigit可以判断是不是数字,头文件#include<ctype.h>
//判断的时候无结束符
//就用string哈哈哈
#include<bits/stdc++.h>
#include<ctype.h>
using namespace std;
#define Maxsize 100
typedef struct Stack{
int data[Maxsize];//0~Maxsize-1
int top;
}Stack,*pStack;
pStack CreateStack(){
pStack head=new Stack();
head->top=-1;
return head;
}
bool isFull(pStack L){
if(L->top ==Maxsize-1) return true;
return false;
}
bool isEmpty(pStack L){
if(L->top ==-1) return true;
return false;
}
bool Push(pStack L,char e){
if(isFull(L)) return false;
L->data [++(L->top)]=e;
return true;
}
char Pop(pStack L){
if(isEmpty(L)) return false;
return L->data [(L->top )--];
}
int main(){
pStack head;
head=CreateStack();
string ss;char e;cin>>ss;
int flag=0,flag1=0;
bool ismatch=true;
for(int i=0;ss[i];i++){
while((isdigit(ss[i])||ss[i]=='.')||(i==0&&ss[i]=='-')||((ss[i]=='-')&&(ss[i-1]=='('))){
//是第一次
if(i==0){
cout<<ss[i];
i++;
}
//不连着 不是第一次
else if(!ismatch&&(i!=0)){
cout<<" "<<ss[i];
i++;
}
//连着的时候
else if(ismatch){
cout<<ss[i];
i++;
}
if(!isdigit(ss[i])&&ss[i]!='.'){
ismatch=false;
break;
}
else{
ismatch=true;
}
}
if(ss[i]==')'){
e=Pop(head);
while(e!='('){
cout<<" "<<e;
e=Pop(head);
}
}
//如果是+-的话,就把栈顶元素 1弹出判断优先级 2输出或者再放入
else if(((ss[i]=='+')||((ss[i]=='-')&&i!=0))&&ss[i-1]!='('){
if(isEmpty(head)) Push(head,ss[i]);
else{
do{
e=Pop(head);
if(e=='('){
Push(head,'(');
}
else cout<<" "<<e;
}while(e!='('&&!isEmpty(head));//关键!!
Push(head,ss[i]);
}
}
else if(ss[i]=='*'||ss[i]=='/'||ss[i]=='('){
Push(head,ss[i]);
}
}
while(!isEmpty(head)){
e=Pop(head);
cout<<" "<<e;
}
return 0;
}