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 右括號...