22 棧的應用 中綴表示式轉字尾表示式

2022-07-13 13:36:12 字數 3415 閱讀 3957

main.c

#define _crt_secure_no_warning#include

#include

#include

#include

"stack.h"//

判斷是不是數字

int isnumber(char

c) //

判斷是不是左括號

int isleft(char

c) //

判斷是不是右括號

int isright(char

c) //

判斷是不是運算符號

int isoperate(char

c) //

返回運算符號優先順序

int getpriority(char

c)

if (c == '

+' || c == '-'

)

return0;

}typedef

struct

mychar mychar;

//數字操作

void numberoperate(char*p)

//建立mychar

mychar* creatmychar(char*p)

//左括號操作

void leftoperate(linkstack* stack,char*p)

//右括號操作

void rightoperate(linkstack*stack)

//輸出

printf("

%c", *(mychar->p));

//彈出

pop(stack);

//釋放記憶體

free

(mychar);

}}//

運算符號的操作

void operateoperate(linkstack* stack, char*p)

//如果棧頂符號優先順序低於當前字元的優先順序 直接入棧

if (getpriority(*(mychar->p)) < getpriority(*p))

//如果棧頂符號優先順序不低

else

//輸出

printf("

%c",*(mychar2->p));

//彈出

pop(stack);

//釋放

free

(mychar2);}}

}int

main()

//如果是左括號,直接進棧

else

if (isleft(*p))

//如果是右括號

else

if (isright(*p))

//如果是運算符號

else

if (isoperate(*p))

p++;

}while (stacklength(stack)>0

) printf("\n

");system(

"pause");

return0;

}

stack.h

#ifndef stack_h

#define stack_h#include

#include

#include

#define ok 1

#define error 0

#define true 1

#define false 0typedef

void*selemtype;

typedef

intstatus;

//初始化結構

typedef struct

stacknode stacknode, *linkstackptr;

typedef

struct

linkstack linkstack;

//初始化操作,建立乙個空棧

linkstack*initstack();

//將棧清空

void clearstack(linkstack *s);

//銷毀

void destorystack(linkstack *s);

//若棧為空,返回true,否則返回false

status isempty(linkstack s);

//若棧存在且非空,返回s的棧頂元素

void* gettop(linkstack *s);

//插入元素e為新的棧頂元素

status push(linkstack *s, selemtype e);

//若棧不空,則刪除s的棧頂元素,並返回ok,否則返回error

status pop(linkstack *s);

//返回棧s的元素個數

status stacklength(linkstack *s);

//列印

void printfstack(linkstack *s);

#endif

stack.c

#include"

stack.h"//

初始化操作,建立乙個空棧

linkstack*initstack()

//將棧清空

void clearstack(linkstack *s)

//銷毀

void destorystack(linkstack *s)

linkstackptr p;

p = s->top;//

將棧頂結點賦值給p

while (p !=null)

s->count = 0

;

free

(s);}//

若棧為空,返回true,否則返回false

status isempty(linkstack s)

return

false;}//

若棧存在且非空,返回s的棧頂元素

void* gettop(linkstack *s)

return s->top->data;}//

插入元素e為新的棧頂元素

status push(linkstack *s, selemtype e)

//若棧不空,則刪除s的棧頂元素,並返回ok,否則返回error

status pop(linkstack *s)

p = s->top;//

將棧頂結點賦值給p

s->top = p->next;//

使得棧頂指標下移一位,指向後一結點

free(p);//

釋放結點p

s->count--;

return

ok;}

//返回棧s的元素個數

status stacklength(linkstack *s)

棧的應用 中綴表示式轉字尾表示式

有關棧api詳情請參看我的另一篇博文 棧的鏈式儲存 api實現 例項 5 4 5 4 1 2 3 1 2 3 8 3 1 5 8 3 1 5 中綴表示式符合人類的閱讀和思維習慣 字尾表示式符合計算機的 運算習慣 中綴轉字尾演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進...

棧的應用 (中綴表示式 轉 字尾表示式)

中綴表示式 字尾表示式,都是用來呈現運算表示式的一種方式。標準表示式 4 5 6 7 中綴表示式,就是標準的表示式,即4 5 6 7 字尾表示式,符號在後的表示式,即4 5 6 7 中綴表示式轉字尾表示式的思想是 注意的是 只有 這5種符號才會入棧 1.讀到運算元時,立即輸出 2.讀到的是操作符,分...

棧的應用 中綴表示式轉字尾表示式

中綴轉字尾過程 1.對於數字 直接輸出 2.對於符號 2.1 左括號 進棧 2.2 運算符號 與棧頂符號進行優先順序比較,若棧頂符號優先順序低 此符號進棧 若棧頂符號優先順序不低 將棧頂符號彈出並輸出,之後進棧 若是乘除直接進棧 若是加減,與棧頂比較,若棧頂是乘除,直接輸出,否則進棧。2.3 右括號...