输入空格跳出循环
while((k=getchar())!='\n')
{
a[i]=k;
i++;
}
后缀表达式(此代码仅限于0~9内的加减乘除)
#include <iostream>
#include <stdlib.h>
#include <stdbool.h>
#define long 10
using namespace std;
typedef struct stack
{
int* base;
int top;
int size;
}qstack;
void init(qstack &s,int size)
{
s.base=(int*)malloc(size*sizeof(int));
s.top=0;
s.size=size;
}
void push(qstack &s,int num)
{
int*new_;
if(s.top==s.size)
{
new_=(int*)realloc(s.base,(long+s.size)*sizeof(int));
s.size=s.size+long;
}
s.base[s.top]=num;
s.top++;
}
int pop(qstack &s)
{
int e;
s.top--;
e=s.base[s.top];
return e;
}
int judge(char a[],qstack &s,int e)//判断
{
int sum;
int lin=0,lin_=0;
int i=0;
for(i=0;i<e;i++)
{
if(a[i]==43||a[i]==45||a[i]==47||a[i]==42)//先判断是不是运算符号
{
lin=pop(s);//栈顶出栈
lin_=pop(s);//出栈
if(a[i]=='*')//应该先判断乘除在判断加减
lin=lin*lin_;
else if(a[i]=='/')
lin=lin/lin_;
else if(a[i]=='+')
lin=lin+lin_;
else if(a[i]=='-')
lin=lin-lin_;
push(s,lin);//得到的新数字入栈
}
else if((a[i]>=40)&&(a[i]<=57))//判断是否式数字
{
sum=a[i]-'0';//将acsll转换成数字
push(s,sum);
}
}
return lin;
}
int main()
{
qstack s;
char k;
int i=0,j;
char a[100];
init(s,100);
while((k=getchar())!='\n')
{
a[i]=k;
i++;
}
j=judge(a,s,i);
cout<<j;
push(s,1);
return 0;
}
中缀到后缀
注意注意当不用指针的时候qlist不要忘记&
例子1+2*3+(4*5+6)*7
符号规则:+- 如果是空栈,则入栈,如果不是空栈,栈里元素(+-/*)出栈到清空,或者清空到遇见(的时候,+入栈
*/ 如果是空栈,则入栈,如果栈顶是+-,则入栈,如果是/*,则栈顶出栈,*入栈
() (入栈,当遇到)的时候,把(前面的元素出栈到数组中,(出栈
#include <iostream>
#include <stdlib.h>
#include <stdbool.h>
using namespace std;
typedef struct stack//栈的基本操作
{
char *base;
int top;
int lenghsize;
}qstack;
void init(qstack &s,int size)
{
s.base=(char*)malloc(size*sizeof(char));
s.top=0;
s.lenghsize=size;
}
void push(qstack &s,char c)
{
s.base[s.top]=c;
s.top++;
}
bool empty(qstack &s)
{
if(s.top==0)
{
return true;
}
else
return false;
}
char pop(qstack &s)
{
char e;
if(empty(s))
{
cout<<"error";
}
s.top--;
e=s.base[s.top];
return e;
}
char gettop(qstack &s)
{
char e;
e=s.base[s.top-1];
return e;
}
void convert(char a[],int e)//中缀转化到后缀
{
char temp[100];//存储后缀的字符串
int i,j=0;
char k;//栈顶字符的返回
qstack s;
init(s,100);
for(i=0;i<e;i++)
{
if(a[i]>='0' && a[i]<='9')//如果是数字的话
{
temp[j]=a[i];//存入数组
j++;
}
else if(a[i]=='(')//如果是(
{
push(s,a[i]);//入栈
}
else if(a[i]==')')//如果是)
{
while(empty(s)== false)//从栈顶一直出栈到(,(前面的字符进入数组
{
if(gettop(s)=='(')
{
pop(s);
break;//当出栈到(的时候break;
}
else
{
temp[j]=gettop(s);
j++;
pop(s);
}
}
}
else if(a[i]=='+' || a[i]=='-')//如果是+-
{
while(empty(s)==false)
{
k=gettop(s);
if(k=='+' || k=='-' || k=='*' || k=='/')//一直出栈,除非遇到(
{
temp[j]=pop(s);
j++;
}
else
break;
}
push(s,a[i]);//把a[i]入栈
}
else if(a[i]=='*' || a[i]=='/')//如果是*/
{
k=gettop(s);
while(empty(s)==false)
{
if(k=='*' || k=='/')//如果栈顶是*/
{
temp[j]=gettop(s);//栈顶出栈
j++;
pop(s);
}
else
break;
}
push(s,a[i]);//a[i]入栈
}
}
while(empty(s)==false)//到最后如果a数组都已经遍历完成但是栈还没有空,就把栈的元素出栈
{
temp[j]=gettop(s);
j++;
pop(s);
}
for(i=0;i<j;i++)
{
cout<<temp[i];
}
}
int main()
{
int i=0;
char a[100];
char c;
while((c=getchar())!='\n')
{
a[i]=c;
i++;
}
convert(a,i);
return 0;
}