栈 c语言表示方法,栈的应用:中缀表达式转为后缀表达式(c语言实现)

data[i]=NULL;

S->top=-1;

return OK;

}

//2. 创建一个长度为n的堆栈

Status CreateStack(Stack *S,int n){

if(n>MAXSIZE || n<1){

printf("输入长度有误!\n");

return ERROR;

}

srand(time(0));

int i;

for(i=0;idata[i]=rand()%100+1;

}

S->top=n-1;

return OK;

}

//3. 压栈操作

Status push(Stack *S,ElemType e){

if(MAXSIZE-1==S->top){

printf("栈已满\n");

return ERROR;

}

//栈顶指向的元素有值

++(S->top);

S->data[S->top]=e;

return OK;

}

//4. 出栈

Status pop(Stack *S,ElemType *e){

//将栈顶元素出栈,传给e

if(-1==S->top){

printf("栈为空!\n");

return ERROR;

}

*e=S->data[S->top];

--(S->top);

return OK;

}

//5. 中缀表达式转后缀表达式

void MidToFinal(char *mid,char *final){

//中缀表达式为middle,要转换成后缀表达式传给last

//新建一个栈,来存储符号

char e;

Stack S;

if(OK!=InitStack(&S)){

printf("初始化栈失败!\n");

}

//当带转换的字符串*mid未终止时,循环处理

while(*mid){

//如果是数字,则直接输出

if(*mid>='0' && *mid<='9'){

*(final++)=*(mid++);

continue;

}else if(*mid=='+' || *mid=='-' || *mid=='*' || *mid=='/' || *mid=='(' || *mid==')'){

//输入的是合法运算符号,比较之前是否有更高优先级的符号

if(S.top==-1 || '('==*mid){

//当符号栈为空或遇到左括号时,符号入栈

push(&S,*(mid++));

continue;

}

if(')'==*mid){

//遇到右括号时,栈顶元素依次出栈;直到遇到第一个左括号时结束

pop(&S,&e);

*(final++)=e;

while(pop(&S,&e) && e!='('){

*(final++)=e;

}

// printf("%c\n",e);

mid++;

continue;

}

//后续的处理都要取出临时的栈顶元素,与当前输入的符号*mid相比较;当临时栈顶元素优先级大于等于输入符号的优先级时,出栈;否则符号入栈(已经弹出一个,记得把弹出的元素也入栈)

pop(&S,&e);

if('+'==*mid || '-'==*mid){

if(e=='('){

push(&S,'(');

push(&S,*(mid++));

continue;

}else{

*(final++)=e;

push(&S,*(mid++));

continue;

}

}else if('*'==*mid || '/'==*mid){

if('*'==e || '/'==e){

*(final++)=e;

push(&S,*(mid++));

continue;

}else{

push(&S,e);

push(&S,*(mid++));

continue;

}

}

}else{

printf("输入的字符不合法!%c\n",*mid);

return ERROR;

}

}

//当待转换的字符已经结束时,符号栈至少还有一个元素(中缀表达式的特点:数字结尾;后缀表达式以符号结尾);将栈中的元素依次出栈

while(S.top!=-1){

pop(&S,&e);

*(final++)=e;

}

//字符串的结束符!

*final='\0';

}

int main()

{

/*

Stack S;

int i,n,e;

if(OK!=InitStack(&S)){

printf("初始化失败!");

return ERROR;

}

printf("输入初始化栈的长度n=");

scanf("%d",&n);

if(OK==CreateStack(&S,n)){

for(i=0;i<=S.top;i++){

printf("%d\t",S.data[i]);

}

}

printf("\n输入想要插入栈的值");

while(1==scanf("%d",&e)){

if(ERROR==push(&S,e)){

break;

}else{

for(i=0;i<=S.top;i++)

printf("%d\t",S.data[i]);

}

}

printf("\n接下来测试出栈!栈中的元素依次出栈\n");

while(OK==pop(&S,&e)){

getchar();

printf("%d\t",e);

}

*/

char data[]="3+(5*6-7/1*7)*9";

char final[]="";

MidToFinal(data,final);

printf("%s\n",final);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值