中缀表达式转换成后缀表达式,包括加减乘除,c语言编程

Python014

中缀表达式转换成后缀表达式,包括加减乘除,c语言编程,第1张

#include<stdio.h>

#include<stdlib.h>

typedef struct astack *Stack

typedef struct astack

{

int top

int maxtop

char* data

}Astack

Stack NewEmpty(int size)

{

Stack S=(Stack)malloc(sizeof(Astack))

S->maxtop=size

S->top=-1

S->data=(char*)malloc(size*sizeof(char))

return S

}

int StackEmpty(Stack S)

{

return S->top<0

}

int StackFull(Stack S)

{

return S->top==S->maxtop

}

int Peek(Stack S)

{

return S->data[S->top]

}

void Push(char x,Stack S)

{

if(StackFull(S))

{

printf("Stack is full!\n")

exit(1)

}

else

S->data[++S->top]=x

}

int Pop(Stack S)

{

if(StackEmpty(S))

{

printf("Stack is empty!\n")

exit(1)

}

else

return S->data[S->top--]

}

Stack NewStack(int size)

{

Stack S=NewEmpty(size)

int i,x,num

printf("Please enter the number of data:\n")

scanf("%d",&num)

for(i=0i<numi++)

{

printf("Please enter the %d date:\n",i+1)

scanf("%c",&x)

Push(x,S)

}

return S

}

void ShowStack(Stack S)

{

int i

for(i=0i<=S->topi++)

{

printf(" %c",S->data[i])

}

printf("\n")

}

原输入字符串后面不用添加#,字符串的结束符是'\0'

#不应该参与比较,但是要第一个压入堆栈,a数组定义为[6][6]。在poplinkstack时用循环,因为出栈的可能是多个运算符。当数字读入结束时(也就是字符串结束时)输出所有在站内的符号,直到#的出现。

这是算法#include<stdio.h>

#include<stdlib.h>

#define TRUE 1

#define FALSE 0

#define MAXNUM 100

typedef int DataType

typedef struct

{

DataType s[MAXNUM]

int t

}SeqStack,*PSeqStack

//构造一个空栈

PSeqStack createEmptyStack_seq()

{

PSeqStack pastack

pastack=(SeqStack*)malloc(sizeof( SeqStack))

if (pastack==NULL)

{

printf("空间不够!!\n")

}

else

{

pastack->t=-1

}

return pastack//返回空栈顶

}

//清空栈

int isEmptyStack_seq(PSeqStack pastack)

{

return pastack->t==-1

}

//入栈

void push_seq(PSeqStack pastack, DataType x)

{

if (pastack->t >= MAXNUM - 1)

printf("上溢!\n")

else

{

pastack->t = pastack->t+1

pastack->s[pastack->t]=x

}

}

//出栈

void pop_seq(PSeqStack pastack)

{

if (pastack->t==-1)

{

printf("下溢!\n")

}

else

{

pastack->t = pastack->t-1

}

}

//返回栈顶元素的值

DataType top_seq(PSeqStack pastack)

{

return pastack->s[pastack->t]

}

/*将中缀表达式转换为后缀表达式,顺利转换返回true,若转换过程中发现中缀表达式非法则返回false*/

int infixtoSuffix(const char* infix, char* suffix)

{

int state_int = FALSE/*state_int记录状态,等于true表示刚读入的是数字字符,等于false表示刚读入的是运算符,

设置这个变量是为了在每输出一个整数后输出一个空格,以免连续输出的两个整数混在一起。*/

char c, c2

PSeqStack ps = createEmptyStack_seq()/*构造一个运算符栈*/

int i, j = 0

if(infix[0]=='\0')

{

return FALSE/*不允许出现空表达式*/

}

for(i=0infix[i]!='\0'i++)

{

c=infix[i]

switch(c)

{

case ' ':

case '\t':

case '\n':

if(state_int== TRUE)

{

suffix[j++]=' '/*状态从true转换为false时输出一个空格*/

}

state_int= FALSE

break/*遇到空格或制表符忽略*/

case '0':

case '1':

case '2':

case '3':

case '4':

case '5':

case '6':

case '7':

case '8':

case '9':

state_int =TRUE

suffix[j++]=c/*遇到数字输出*/

break

case '(':

if(state_int==TRUE)

{

suffix[j++]=' '/*状态从true转换为false时输出一个空格*/

}

state_int=FALSE

push_seq(ps, c)/*遇到左括号,入栈*/

break

case ')':

if(state_int== TRUE)

{

suffix[j++]=' '/*状态从true转换为false时输出一个空格*/

}

state_int=FALSE

c2 = ')'

while(!isEmptyStack_seq(ps))

{

c2=top_seq(ps)/*取栈顶*/

pop_seq(ps)/*出栈*/

if(c2 =='(')

{

break

}

suffix[j++]=c2

}

if(c2 !='(')

{

free(ps)

suffix[j++]='\0'

return FALSE

}

break

case '+':

case '-':

if(state_int == TRUE)

{

suffix[j++] = ' '

}

state_int = FALSE

while(!isEmptyStack_seq(ps))

{

c2 = top_seq(ps)

if(c2 =='+'|| c2 =='-'|| c2 == '*' || c2 == '/')

{

pop_seq(ps)

suffix[j++] = c2

}

else if(c2=='(')

{

break

}

}

push_seq(ps, c)

break

case '*':

case '/':

if(state_int==TRUE)

{

suffix[j++] = ' '

}

state_int = FALSE

while(!isEmptyStack_seq(ps))

{

c2 = top_seq(ps)

if(c2 == '*' || c2 == '/')

{

pop_seq(ps)

suffix[j++] = c2

}

else if(c2=='+'||c2=='-'||c2=='(')

{

break

}

}

push_seq(ps, c)

break

default:

free(ps)

suffix[j++] = '\0'

return FALSE

}

}

if(state_int == TRUE)

{

suffix[j++] = ' '

}

while(!isEmptyStack_seq(ps))

{

c2 = top_seq(ps)

pop_seq(ps)

if(c2 == '(')

{

free(ps)

suffix[j++] = '\0'

return FALSE

}

suffix[j++] = c2

}

free(ps)

suffix[j++] = '\0'

return TRUE

}

//计算后缀

int calculateSuffix(const char * suffix, int * presult)

{

int state_int = FALSE

PSeqStack ps = createEmptyStack_seq()

int num = 0, num1, num2

int i

char c

for(i = 0suffix[i] != '\0'i++)

{

c = suffix[i]

switch(c)

{

case '0':

case '1':

case '2':

case '3':

case '4':

case '5':

case '6':

case '7':

case '8':

case '9':

if(state_int == TRUE)

{

num = num * 10 + c - '0'

}

else

{

num = c - '0'

}

state_int = TRUE

break

case ' ':

case'\t':

case '\n':

if (state_int == TRUE)

{

push_seq(ps, num)

state_int = FALSE

}

break

case '+':

case '-':

case '*':

case '/':

if(state_int == TRUE)

{

push_seq(ps, num)

state_int = FALSE

}

if(isEmptyStack_seq(ps))

{

free(ps)

return FALSE

}

num2 = top_seq(ps)

pop_seq(ps)

if(isEmptyStack_seq(ps))

{

free(ps)

return FALSE

}

num1 = top_seq(ps)

pop_seq(ps)

if(c == '+')

{

push_seq(ps, num1 + num2)

}

if(c == '-')

{

push_seq(ps, num1 - num2)

}

if(c == '*')

{

push_seq(ps, num1 * num2)

}

if(c == '/')

{

push_seq(ps, num1 / num2)

}

break

default:

free(ps)

return FALSE

}

}

*presult = top_seq(ps)

pop_seq(ps)

if(!isEmptyStack_seq(ps))

{

free(ps)

return FALSE

}

free(ps)

return TRUE

}

void getline(char* line, int limit)

{

char c

int i=0

while(i<limit-1&&(c = getchar())!=EOF&&c!='\n')

{

line[i++]=c

}

line[i]='\0'

}

//主函数

void main()

{

char c, infix[MAXNUM], suffix[MAXNUM]

int result

int flag = TRUE

while(flag == TRUE)

{

printf("请输入任意一个整数算术表达式:\n")

getline(infix, MAXNUM)

if(infixtoSuffix(infix, suffix) == TRUE)

{

printf("所有后缀为:%s\n", suffix)

}

else

{

printf("无效缀!\n")

printf("\n继续? (y/n)")

scanf("%c", &c)

if(c == 'n' || c == 'N')

{

flag = FALSE

}

while(getchar() != '\n')

{

printf("\n")

}

continue

}

if(calculateSuffix(suffix, &result) == TRUE)

{

printf("结果为:%d\n", result)

}

else

{

printf("非法后缀!\n")

}

printf("\n继续? (y/n)")

scanf("%c", &c)

if(c == 'n' || c == 'N')

{

flag = FALSE

}

while(getchar() != '\n')

{

printf("\n")

}

}

}