亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

如何用C語言、Python實現棧及典型應用

2020-01-26 14:29:22
字體:
來源:轉載
供稿:網友

前言

棧是什么,你可以理解為一種先入后出的數據結構First In Last Out),一種操作受限的線性表...

C實現

借助與C語言中的void指針及函數指針,我們可以實現一個鏈式通用棧:

/* stack.h */#ifndef _STACK_H_#define _STACK_H_typedef struct stackNode { void *value; struct stackNode *next;} stackNode;typedef struct stack { stackNode *top; void (*free)(void *ptr); unsigned long size;} stack;/* Functions implemented as macros */#define stackTop(s) ((s)->top)#define stackSize(s) ((s)->size)#define stackSetFreeMethod(s, m) ((s)->free = (m))#define stackGetFreeMethod(s) ((s)->free)stack *stackCreate(void);stack *stackPush(stack *stack, void *value);stackNode *stackPop(stack *stack);void stackClear(stack *stack);#endif /* _STACK_H_ *//* stack.c */#include <stdlib.h>#include "stack.h"stack *stackCreate(void){ struct stack *stack; if ((stack = (struct stack *)malloc(sizeof(struct stack))) == NULL) return NULL; stack->top = NULL; stack->free = NULL; stack->size = 0; return stack;}stack *stackPush(stack *stack, void *value){ stackNode *node; if ((node = (stackNode *)malloc(sizeof(stackNode))) == NULL) return NULL; node->value = value; node->next = (stack->size == 0) ? NULL : stack->top; stack->top = node; stack->size++; return stack;}stackNode *stackPop(stack *stack){ stackNode *node; node = stack->top; if (stack->size != 0) { stack->top = node->next; stack->size--; } return node;}void stackClear(stack *stack){ unsigned long size; stackNode *current, *next; current = stack->top; size = stack->size; while (size--) { next = current->next; if (stack->free) stack->free(current->value); free(current); current = next; } free(stack);}

這里的實現附設了一個頭節點,主要用于注冊與棧節點操作相關的函數。我們把棧的大小信息也存了進去,這樣就可以在O(1)的時間內獲取當前棧大小了!

Python實現

在Python中,list其實可以直接作為棧使用,如果你只在它的一端進行操作的話。當然我們也可以簡單封裝一下:

class Stack(object): """A stack encapsulation based on list.""" def __init__(self): self.items = [] def empty(self): return self.items == [] def clear(self): del self.items[:] @property def size(self): return len(self.items) def push(self, item): """Add a new item to the top of the stack.""" self.items.insert(0, item) def pop(self): """Remove the top item from the stack.""" return self.items.pop(0) def top(self): """Return the top item from the stack but not remove it. """ return self.items[0] def __iter__(self): return iter(self.items) def __next__(self): return self.pop()

應用

下面介紹幾個棧的典型應用。

括號匹配

給你一個算術表達式或者一段C代碼,如何寫一個程序驗證它其中的括號是否匹配?借助棧,可以很容易實現。算法流程如下:

遍歷字符:

     1.如果是左括號,push入棧;

     2. 如果是右括號,這時候如果棧為空,說明不匹配,如果棧不為空并且pop出棧的左括號與右括號類型不一樣,說明不匹配;

     遍歷結束后,如果棧不為空,說明不匹配。

def check_pares(exp): """Check if parentheses match in a expression.""" stack = Stack() pares = {')': '(', ']': '[', '}': '{'} for x in exp: if x in '([{': stack.push(x) elif x in ')]}': if stack.empty() or pares[x] != stack.pop(): return False return True if stack.empty() else False

數制轉換

以十進制轉二進制為例:

def dec2bin(dec): """Converting decimal number to binary string.""" if dec == 0: return '0' stack = Stack() while dec: r = dec % 2 stack.push(r) dec = dec // 2 return ''.join(str(digit) for digit in stack)

模擬遞歸

遍歷二叉樹算是經典的遞歸應用了。我們以先序遍歷為例,遞歸版本的代碼很容易寫:

def preorder_traversal(root): """ 1 / / 2 3 / / / 4 5 6 """ if not root: return print(root.val) preorder_traversal(root.lchild) preorder_traversal(root.rchild)

下面是非遞歸的版本:

def preorder_traversal(root) s = Stack() while s.size or root: if root: print(root.val) s.push(root) root = root.lchild else: root = s.pop().rchild

總結

以上就是如何用C語言和Python實現棧及典型應用的全部內容,希望對大家的學習有所幫助,也希望大家繼續支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精久久久久久| 欧美日韩国产页| 国产精品美女无圣光视频| 26uuu另类亚洲欧美日本一| 欧美成人黑人xx视频免费观看| 亚洲欧美中文另类| 国产综合视频在线观看| 日韩欧美亚洲一二三区| 国产精品视频xxxx| 欧美激情精品久久久| 国产欧美久久一区二区| 97色在线播放视频| 毛片精品免费在线观看| 国内成人精品视频| 欧美美最猛性xxxxxx| 精品久久久中文| 午夜精品蜜臀一区二区三区免费| 97视频在线观看免费高清完整版在线观看| 欧美在线激情网| 国产日产久久高清欧美一区| 成人免费观看a| 亚洲精品欧美日韩专区| 精品国产一区二区在线| 亚洲国产中文字幕久久网| 欧美插天视频在线播放| 欧美视频中文字幕在线| 亚洲精品按摩视频| 精品日本美女福利在线观看| 亚洲激情电影中文字幕| 九九久久综合网站| 亚洲色图av在线| 2019中文字幕全在线观看| 久久精品色欧美aⅴ一区二区| 在线播放亚洲激情| 精品视频在线播放免| 久久久久国产视频| 亚洲国产精品999| 国产午夜精品一区二区三区| 国产精品一区二区久久精品| 最近更新的2019中文字幕| 国产成人综合一区二区三区| 大胆人体色综合| 久久视频免费观看| 亚洲人成电影在线| 日韩大胆人体377p| 超碰日本道色综合久久综合| 狠狠久久五月精品中文字幕| 日韩欧美999| 91国产一区在线| 亚洲老板91色精品久久| 精品国产成人av| 草民午夜欧美限制a级福利片| 久久久久成人精品| 国产亚洲一区精品| 欧洲永久精品大片ww免费漫画| 久久视频这里只有精品| 久久福利网址导航| 成人羞羞国产免费| 亚洲男人的天堂在线播放| 国产欧美一区二区三区视频| 日韩精品在线观| 亚洲精品中文字幕有码专区| 国产成人av在线| 国产精品美女主播在线观看纯欲| 成人亚洲综合色就1024| 亚洲人成在线观| 亚洲欧美在线x视频| 亚洲深夜福利网站| 中文国产成人精品| 97久久久免费福利网址| 国产有码在线一区二区视频| 精品国内产的精品视频在线观看| 亚洲国产成人精品久久| 欧洲中文字幕国产精品| 国产亚洲欧洲高清| 麻豆国产精品va在线观看不卡| 538国产精品一区二区免费视频| 欧美成人久久久| 亚洲激情国产精品| 成人免费高清完整版在线观看| 国产欧美欧洲在线观看| 91精品国产高清久久久久久91| 欧美成人精品一区二区| 欧美日韩午夜剧场| 久久久精品一区| 日韩在线播放一区| 日本精品久久中文字幕佐佐木| 亚洲aaa激情| 成人亚洲综合色就1024| 国产精品一区二区女厕厕| 国产精品久久久久久久av大片| 欧美精品情趣视频| 亚洲一区亚洲二区| 国产成人精品在线播放| 亚洲一区亚洲二区亚洲三区| 91亚洲国产成人精品性色| 日韩av在线精品| 亚洲美女喷白浆| 国产精品久久久久久久7电影| 久久精视频免费在线久久完整在线看| 超碰97人人做人人爱少妇| 成人美女av在线直播| 亚洲高清免费观看高清完整版| 91av在线精品| 亚洲视频免费一区| 中文字幕综合在线| 亚洲免费伊人电影在线观看av| 疯狂蹂躏欧美一区二区精品| 国产精品旅馆在线| 欧美插天视频在线播放| 中文.日本.精品| 国内精品国产三级国产在线专| 欧美重口另类videos人妖| 视频一区视频二区国产精品| 久久精品国产69国产精品亚洲| 宅男66日本亚洲欧美视频| 久久久久久中文字幕| 日韩大片在线观看视频| 国产精品亚洲综合天堂夜夜| 亚洲国产成人久久| 日本欧美黄网站| 91久久久久久久久久久久久| 亚洲欧美成人精品| 国产精品欧美日韩| 成人午夜高潮视频| 最近2019年中文视频免费在线观看| 97视频网站入口| 国产suv精品一区二区三区88区| 超碰91人人草人人干| 精品国产精品三级精品av网址| 亚洲第一网中文字幕| 久久av在线播放| 国产精品日韩在线播放| 日本一本a高清免费不卡| 精品日本美女福利在线观看| 91九色视频导航| 中文字幕免费精品一区高清| 在线播放精品一区二区三区| 久久精品2019中文字幕| 91高清视频免费| 国产精品黄页免费高清在线观看| 欧美做受高潮电影o| 日韩一区二区精品视频| 国产精品一二区| 国产精品一区二区三区毛片淫片| 久久网福利资源网站| 欧美体内谢she精2性欧美| 久久手机精品视频| 亚洲国产高清高潮精品美女| 国产精品扒开腿爽爽爽视频| 国产精品综合网站| 日韩在线高清视频| 亚洲精品国产免费| 亚洲欧美在线x视频| 日韩成人网免费视频| 国产免费一区视频观看免费| 日韩av在线免播放器| 在线视频日韩精品| 国内精品久久久久久中文字幕| 成人久久一区二区三区| 欧美丰满少妇xxxxx做受| 国产精品一区二区女厕厕| 最新69国产成人精品视频免费| 日本高清视频精品|