07 十一月 2006 @ 2:50 下午 

其實這是這學期上的課啦,不過我只算是完成50%,因為計算結果的那部份一下push一下pop把我搞混了,加上最近事情很多,所以沒啥時間去了解(死)。先放上轉後敘的code。

==

#include
#include
#include
#define MAX 50
typedef char Eltype;
Eltype infix[MAX], postfix[MAX];
/*=======================================*/
/*                stack結構              */
/*=======================================*/
/* 將storgae設為暫存陣例,top為stack位置 */
/*=======================================*/
struct stackRec
{
Eltype storage[MAX];
int top;
};
typedef struct stackRec stacktype;
/*=======================================*/
/*          檢查stack是否已滿            */
/*=======================================*/
int isfull( stacktype *s )
{
return (*s).top == MAX;
}
/*=======================================*/
/*          檢查stack是否為空            */
/*=======================================*/
int isempty( stacktype *s )
{
return (*s).top == 0;
}
/*=======================================*/
/*        讓stack回到初始位置            */
/*=======================================*/
/*    因為內容會改變所以傳位置*s         */
/*=======================================*/
void initialize( stacktype *s )
{
(*s).top = 0;
}
/*=======================================*/
/*            放值進stack裡              */
/*=======================================*/
/*    因為內容會改變所以傳位置*s         */
/*=======================================*/
void push( Eltype x, stacktype *s )
{
if( isfull(s) )
{
printf(“stack已滿\n”);
exit(1);
}
else
(*s).storage[(*s).top++] = x;
}
/*=======================================*/
/*            取出stack裡的值            */
/*=======================================*/
/*    因為內容會改變所以傳位置*s         */
/*=======================================*/
Eltype pop( stacktype *s )
{
if( isempty(s) )
{
printf(“stack空的\n”);
exit(1);
}
else
return (*s).storage[–(*s).top];
}

int p( Eltype d )
{
if( d == ‘x’ || d == ‘/’ )
return 2;
else if( d == ‘+’ || d == ‘-‘ )
return 1;
else
return 0;
}

void in_pos( Eltype infix[], Eltype postfix[] )
{
Eltype post;
int i = 0, j = 0, a, b, c;
stacktype s;
initialize( &s );
/*===========================================================================*/
/*                                  判斷運算元                               */
/*===========================================================================*/
/* 1. ( ) 的優先權最大,在來是* / – +,所以先判斷 ( )                        */
/* ————————————————————————- */
/* 2. postfix 為後敘陣列、stack為暫存陣列                                    */
/*===========================================================================*/
/* 基本運算式 + 跟 –                                                         */
/* 在判斷式子的第一步先把第一個得到的數字丟進postfix,第二步則是把運算式丟進 */
/* stack這個暫存的陣列裡。只要是在式子裡的數字都是優先丟進posrtfix,而運算式 */
/* 則是先檢查stack這個暫存陣列裡是否有其他運算式,如果有則先把在stack裡的運  */
/* 算式丟進postfix裡,如果沒有則直接丟進stack                                */
/* ————————————————————————- */
/* 判斷運算式 + – * /                                                        */
/* 先判斷stack裡的運算元為何,如為*或/則優先輸出,否則直接輸出               */
/*===========================================================================*/
while( ( post = infix[i++] ) != ” )
{
switch(post)
{
case ‘(‘: push( post, &s );
break;
case ‘)’:
if( ( !isempty( &s ) )
&& ( p( s.storage[s.top-1] ) >= p( post ) ) )
postfix[j++] = pop( &s );
else
pop( &s );
s.top–;
break;
case ‘+’:
case ‘-‘:
case ‘*’:
case ‘/’:
while( ( !isempty( &s ) )
&& ( p( s.storage[s.top-1] ) <= p( post ) ) )
postfix[j++] = pop( &s );
push( post, &s );
break;
default:postfix[j++] = post;
}
}
while( !isempty( &s ) )
postfix[j++] = pop( &s );
}

int main( void )
{
int i = MAX;

while(i–)
{
infix[i] = '';
postfix[i] = '';
}
printf("輸入式子:");
scanf("%s", infix);

in_pos( infix, postfix );
printf("後敘輸出:%s\n", postfix);

getch();
}

Posted By: fantasy
Last Edit: 07 十一月 2006 @ 02:50 下午

EmailPermalinkComments (0)
Tags
Categories: 程設不歸路

 Last 50 Posts
 Back
 Back
Change Theme...
  • Users » 6
  • Posts/Pages » 131
  • Comments » 6
Change Theme...
  • VoidVoid « Default
  • LifeLife
  • EarthEarth
  • WindWind
  • WaterWater
  • FireFire
  • LightLight

生活大小事



    No Child Pages.

程式設計



    No Child Pages.