九 運用棧的知識對字尾表示式的運算方式進行表達

2021-07-02 20:54:50 字數 3520 閱讀 7312

前言:中綴表示式符合人們的閱讀習慣;  如:5+3

字尾表示式符合計算機的運算習慣;如:53+

現在運用棧的知識對字尾表示式的運算方式進行表達

1、linklist.h

#ifndef _linklist_h_

#define _linklist_h_

typedef void linklist;

typedef struct _tag_linklistnode linklistnode;

struct _tag_linklistnode

;linklist* linklist_create();

void linklist_destroy(linklist* list);

void linklist_clear(linklist* list);

int linklist_length(linklist* list);

int linklist_insert(linklist* list, linklistnode* node, int pos);

linklistnode* linklist_get(linklist* list, int pos);

linklistnode* linklist_delete(linklist* list, int pos);

#endif

2、linklist.c

#include

#include

#include "linklist.h"

typedef struct _tag_linklist

tlinklist;

linklist* linklist_create() // o(1)

return ret;

}void linklist_destroy(linklist* list) // o(1)

void linklist_clear(linklist* list) // o(1)

}int linklist_length(linklist* list) // o(1)

return ret;

}int linklist_insert(linklist* list, linklistnode* node, int pos) // o(n)

node->next = current->next;

current->next = node;

slist->length++;

}return ret;

}linklistnode* linklist_get(linklist* list, int pos) // o(n)

ret = current->next;

}return ret;

}linklistnode* linklist_delete(linklist* list, int pos) // o(n)

ret = current->next;

current->next = ret->next;

slist->length--;

}return ret;

}3、linkstack.h

#ifndef _linkstack_h_

#define _linkstack_h_

typedef void linkstack;

linkstack* linkstack_create();  //建立棧 

void linkstack_destroy(linkstack* stack);  //銷毀棧 

void linkstack_clear(linkstack* stack);   //清空棧 

int linkstack_push(linkstack* stack, void* item);  //進棧 

void* linkstack_pop(linkstack* stack);  //出棧 

void* linkstack_top(linkstack* stack);  //獲取棧頂元素 

int linkstack_size(linkstack* stack);  //獲取棧大小 

#endif

4、linkstack.c

#include

#include "linkstack.h"

#include "linklist.h"

typedef struct _tag_linkstacknode

tlinkstacknode;

linkstack* linkstack_create()   //建立棧 

void linkstack_destroy(linkstack* stack)   //銷毀棧 

void linkstack_clear(linkstack* stack)  //清空棧 

}int linkstack_push(linkstack* stack, void* item)  //進棧 ,item為進棧元素的位址 

if( !ret )

return ret;

}void* linkstack_pop(linkstack* stack)  //出棧 

return ret;

}void* linkstack_top(linkstack* stack)   //獲取棧頂元素 

return ret;

}int linkstack_size(linkstack* stack)   //獲取棧的大小 

5、main.c

#include

#include "linkstack.h"

int isnumber(char c)  //數字輸入 

int isoperator(char c)  //操作符輸入 

int isleft(char c)  //左括號 

int isright(char c)  //有括號 

int priority(char c)  //運算子優先順序處理 

if( (c == '*') || (c == '/') )

return ret;

}void output(char c) //輸出 

}void transform(const char* exp)

//如果為運算子,判斷當前的符號優先順序是否比棧頂低,是的話,執行出棧輸出,否進行壓棧處理 

else if( isoperator(exp[i]) ) 

linkstack_push(stack, (void*)(int)exp[i]);

} //遇到左括號,進行壓棧處理 

else if( isleft(exp[i]) )

else if( isright(exp[i]) ) //遇到右括號時,將左括號上面的符號出棧輸出 ,並將左括號進行出棧處理 

linkstack_pop(stack);

}else

i++;

}while( (linkstack_size(stack) > 0) && (exp[i] == '\0') ) //當遇到結束符時,將棧中剩餘的全都出棧輸出 

linkstack_destroy(stack);

}int main()

棧運用 中綴表示式轉化為字尾表示式 C語言

define stack init size 20 define stackincrement 10 typedef char elemtype typedef struct sqstack void initstack sqstack s void push sqstack s,elemtype ...

棧(字尾表示式的計算)

就我個人來說,字尾表示式看起來很彆扭,但是從變成來看,字尾表示式的處理比中綴表示式的處理方便很多。中綴表示式 30 4 x 5 6 164 字尾表示式 30 4 5 x 6 164 對於中綴表示式而言,一般需要兩個棧 數棧和符號棧,並且處理過程中需要注意括號運算。就上面的中綴表示式來看,先計算括號裡...

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

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