前言:中綴表示式符合人們的閱讀習慣; 如: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 中綴表示式符合人類的閱讀和思維習慣 字尾表示式符合計算機的 運算習慣 中綴轉字尾演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進...