資料結構實驗之棧與佇列二:一般算術表示式轉換成字尾式 sdut-oj
阿新 • • 發佈:2019-01-25
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 100
typedef struct{
char *base;
char *top;
int stacksize;
}sqStack;
void initStack(sqStack *s)
{
s->base = (char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!s->base) exit(0);
s->top = s->base;
s->stacksize = STACK_INIT_SIZE;
}
void Push(sqStack *s,char e)
{
if(s->top - s->base >= s->stacksize)
{
s->base = (char *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(char));
if(!s->base) exit(0);
s->top = s->base + s->stacksize;
s->stacksize +=STACKINCREMENT;
}
*(s->top) = e;
s->top++;
}
void Pop(sqStack *s)
{
if(s->top==s->base) return;
s->top--;
}
int main()
{
sqStack s;
char ch;
initStack(&s);
while(~scanf("%c",&ch)&&(ch!='#'))
{
if(ch>='a'&&ch<='z')//如果是運算元直接輸出
printf("%c",ch);
else if(ch=='(')//如果是‘(’則壓入棧中
Push(&s,ch);
else if(ch==')')//如果是‘)’,依次出棧並輸出,直到取出和它匹配的‘(’為止,‘(’出棧丟棄
{
while(*(s.top-1)!='(')
{
printf("%c",*(s.top-1));
Pop(&s);
}
Pop(&s);
}
/*若是運算元,如果棧空或者該操作符的優先順序大於棧頂操作符則將其放入棧中;
**如果該操作符的優先順序小於等於棧頂操作符,則彈出棧中的操作符並輸出,
**直到該操作符的優先順序大於棧頂操作符或棧空,然後將該操作符入棧。
*/
else if(ch=='+'||ch=='-')
{
if((s.top!=s.base)&&(*(s.top-1)!='('))
{
printf("%c",*(s.top-1));
Pop(&s);
}
Push(&s,ch);
}
else if(ch=='*'||ch=='/')
{
if((s.top==s.base)||(*(s.top-1)!='*')||(*(s.top-1)!='/'))
Push(&s,ch);
else
{
printf("%c",*(s.top-1));
Pop(&s);
Push(&s,ch);
}
}
}
/*當讀到了中綴式的末尾時,如果棧非空則將所有元素依次彈出並輸出*/
while(s.top!=s.base)
{
printf("%c",*(s.top-1));
Pop(&s);
}
return 0;
}
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 100
typedef struct{
char *base;
char *top;
int stacksize;
}sqStack;
void initStack(sqStack *s)
{
s->base = (char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!s->base) exit(0);
s->top = s->base;
s->stacksize = STACK_INIT_SIZE;
}
void Push(sqStack *s,char e)
{
if(s->top - s->base >= s->stacksize)
{
s->base = (char *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(char));
if(!s->base) exit(0);
s->top = s->base + s->stacksize;
s->stacksize +=STACKINCREMENT;
}
*(s->top) = e;
s->top++;
}
void Pop(sqStack *s)
{
if(s->top==s->base) return;
s->top--;
}
int main()
{
sqStack s;
char ch;
initStack(&s);
while(~scanf("%c",&ch)&&(ch!='#'))
{
if(ch>='a'&&ch<='z')//如果是運算元直接輸出
printf("%c",ch);
else if(ch=='(')//如果是‘(’則壓入棧中
Push(&s,ch);
else if(ch==')')//如果是‘)’,依次出棧並輸出,直到取出和它匹配的‘(’為止,‘(’出棧丟棄
{
while(*(s.top-1)!='(')
{
printf("%c",*(s.top-1));
Pop(&s);
}
Pop(&s);
}
/*若是運算元,如果棧空或者該操作符的優先順序大於棧頂操作符則將其放入棧中;
**如果該操作符的優先順序小於等於棧頂操作符,則彈出棧中的操作符並輸出,
**直到該操作符的優先順序大於棧頂操作符或棧空,然後將該操作符入棧。
*/
else if(ch=='+'||ch=='-')
{
if((s.top!=s.base)&&(*(s.top-1)!='('))
{
printf("%c",*(s.top-1));
Pop(&s);
}
Push(&s,ch);
}
else if(ch=='*'||ch=='/')
{
if((s.top==s.base)||(*(s.top-1)!='*')||(*(s.top-1)!='/'))
Push(&s,ch);
else
{
printf("%c",*(s.top-1));
Pop(&s);
Push(&s,ch);
}
}
}
/*當讀到了中綴式的末尾時,如果棧非空則將所有元素依次彈出並輸出*/
while(s.top!=s.base)
{
printf("%c",*(s.top-1));
Pop(&s);
}
return 0;
}