作者bleed1979 (十三)
看板C_and_CPP
标题Re: [问题] 资料结构-用c语言array写stack,push和 …
时间Fri Apr 10 02:28:12 2009
我把所有break用/**/注解起来就是让你知道为什麽程式会跳出
我只就语法修改, 简单地算式应该可以对, 复杂的可能还要再debug
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include <stdlib.h>
typedef struct STACK
{
char item [1000];
int top;
}STACK;
STACK S;
void push(char );
void pop(int *);
int main()
{
char infix[1000];
char postfix[1000];
int i = 0, j = 0;
char token;
int y;
S.top=0;
printf("请输入中序式, 例如 (a+b)*c-d/e :\n");
scanf("%s",infix);
//----开始进行转换为postfix的动作
//think:将扫的字元分为符号和字母,依括号法字母直接扫入新的array
//运算子-符号则分为( ) + - * / ,左括号一律扫入,直到有右括号对应 " * / "
的优先权大於" + - "
while(infix[i] != '\0')
{
token=infix[i++];
if( (token) >='a' && (token)<='z')
{
postfix[j++] = token;
}
else
{//为符号-分为6种情况
if(token==')')
{//右括号,遇到要把到左括号之前的全部POP出 并除去左括号
pop(&y);
while(S.top > 0 && y != '(')
{
postfix[j++]=y;
pop(&y);
}//y不等於左括号,印出y
push(y);
push(token);
/*break;*/
} //end ')'
else if( token=='(' ) push(token);//case '(' 在stack外优先权最高,
stack内优先权最低
else if( token=='+')
{//case '+' 优先权等於 + - 小於 * / 大於(
if( (S.top==0) || (S.item[S.top]=='(')) push(token);
else
{
pop(&y);
while(S.top > 0 && (y == '*' || y == '/' || y=='+' ||
y=='-'))
{//y是优先权<=的情况
postfix[j++]=y;
pop(&y);
}//end while
push(y);
push(token);
/*break;*/
}
}//end case '+'
else if( token=='-')
{//case '-'
if( S.top==0 || S.item[S.top]=='(') push(token);
else
{
pop(&y);
while(S.top > 0 && (y == '*' || y == '/' || y=='+' ||
y=='-'))
{//y是优先权<=的情况
postfix[j++]=y;
pop(&y);
}//end while
push(y);
push(token);
/*break;*/
}
}//end case '-'
else if( token=='*')
{//优先权等於 * / 大於( + -
if( S.top==0 || S.item[S.top]=='(' || S.item[S.top]=='+' ||
S.item[S.top]=='-') push(token);
else
{
pop(&y);
while(S.top > 0 && (y == '*' || y == '/'))
{
postfix[j++]=y;
pop(&y);
}
push(y);
push(token);
/*break;*/
}
}//end case '*'
else
{ //token = '/'
if( S.top==0 || S.item[S.top]=='(' || S.item[S.top]=='+' ||
S.item[S.top]=='-') push(token);
else
{
pop(&y);
while(S.top > 0 && (y == '*' || y == '/'))
{
postfix[j++]=y;
pop(&y);
}
push(y);
push(token);
/*break;*/
}
}//end case '/'
}//end else 符号
}//end 扫入工作
while(S.top > 0)
{//当扫入完成後清空stack
pop(&y);
postfix[j++]=y;
}
postfix[j] = '\0';
for(i=0;postfix[i]!='\0';i++)
printf("%c",postfix[i]);
printf("\n");
system("PAUSE");
return 0;
}//end main
void push(char x){
if (S.top<1000){
S.top++;
S.item[S.top]=x;}
}
void pop(int *y){
if (S.top > 0){
*y=S.item[S.top];
S.top--;}
}
--
World of bleed1979
http://bleed1979.myweb.hinet.net/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.168.133.22
1F:推 lovemost:後来发觉是pop的地方要加一个假如不成立该如何的条件 04/11 20:26
2F:→ lovemost:不给条件回传的就是跳出 04/11 20:27
3F:→ lovemost:break;是别的语言的写法...如果用c写应该加一个push才对 04/11 20:27
4F:推 lovemost:谢谢你的帮忙... 04/11 20:36