最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何用C語言、Python實現(xiàn)棧及典型應(yīng)用

 更新時間:2016年08月05日 15:26:53   投稿:daisy  
本文先通過實例分別介紹了如何用C語言、Python實現(xiàn)棧,后又介紹棧的典型應(yīng)用,對大家學(xué)習(xí)棧很有借鑒參考價值,下面一起來看看吧。

前言

棧是什么,你可以理解為一種先入后出的數(shù)據(jù)結(jié)構(gòu)First In Last Out),一種操作受限的線性表...

C實現(xiàn)

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

/* 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);
}

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

Python實現(xiàn)

在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()

應(yīng)用

下面介紹幾個棧的典型應(yīng)用。

括號匹配

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

遍歷字符:

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

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

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

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

數(shù)制轉(zhuǎn)換

以十進制轉(zhuǎn)二進制為例:

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)

模擬遞歸

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

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

總結(jié)

以上就是如何用C語言和Python實現(xiàn)棧及典型應(yīng)用的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家繼續(xù)支持腳本之家。

相關(guān)文章

  • C語言驅(qū)動開發(fā)之內(nèi)核文件的讀寫

    C語言驅(qū)動開發(fā)之內(nèi)核文件的讀寫

    這篇文章主要為大家詳細介紹了C語言驅(qū)動開發(fā)中內(nèi)核文件的讀寫的系列函數(shù),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • c語言如何設(shè)置隨機數(shù)及逐行解析

    c語言如何設(shè)置隨機數(shù)及逐行解析

    在C語言中,rand()函數(shù)可以用來產(chǎn)生隨機數(shù),但是這不是真真意義上的隨機數(shù),是一個偽隨機數(shù),下面這篇文章主要給大家介紹了關(guān)于c語言如何設(shè)置隨機數(shù)及逐行解析的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C++ 類this及返回自身對象的引用方式

    C++ 類this及返回自身對象的引用方式

    這篇文章主要介紹了C++ 類this及返回自身對象的引用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 深入解析Radix Sort基數(shù)排序算法思想及C語言實現(xiàn)示例

    深入解析Radix Sort基數(shù)排序算法思想及C語言實現(xiàn)示例

    基數(shù)排序和桶排序、計數(shù)排序共同是三種最常用的線性排序算法,這里我們就來深入解析Radix Sort基數(shù)排序算法思想及C語言實現(xiàn)示例,需要的朋友可以參考下
    2016-07-07
  • c/c++輸出重定向的方法

    c/c++輸出重定向的方法

    c/c++輸出重定向的方法,需要的朋友可以參考一下
    2013-03-03
  • C語言基礎(chǔ)知識點解析(extern,static,typedef,const)

    C語言基礎(chǔ)知識點解析(extern,static,typedef,const)

    本篇文章是對C語言基礎(chǔ)知識點(extern,static,typedef,const)的用法進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-10-10
  • C++11?關(guān)鍵字?const?使用小結(jié)

    C++11?關(guān)鍵字?const?使用小結(jié)

    const大致意思是“我承諾不改變這個值”。主要用于說明接口,這樣在把變量傳入函數(shù)時就不必擔心變量會在函數(shù)內(nèi)被改變,本文給大家介紹C++11?關(guān)鍵字?const?使用小結(jié),感興趣的朋友一起看看吧
    2021-12-12
  • 一起來學(xué)習(xí)C語言的程序環(huán)境與預(yù)處理

    一起來學(xué)習(xí)C語言的程序環(huán)境與預(yù)處理

    這篇文章主要為大家詳細介紹了C語言程序環(huán)境與預(yù)處理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • OpenSSL動態(tài)鏈接庫源碼安裝教程

    OpenSSL動態(tài)鏈接庫源碼安裝教程

    Openssl 是一個開放源代碼的SSL協(xié)議的產(chǎn)品實現(xiàn),它采用C語言作為開發(fā)語言,具備了跨系統(tǒng)的性能。這篇文章主要介紹了OpenSSL動態(tài)鏈接庫源碼安裝,需要的朋友可以參考下
    2021-11-11
  • C語言入門篇--函數(shù)及數(shù)組用法

    C語言入門篇--函數(shù)及數(shù)組用法

    本篇文章是c語言基礎(chǔ)篇,主要為大家介紹了C語言的函數(shù)與數(shù)組,每個函數(shù)本質(zhì)上都實現(xiàn)一個最小的功能,而main函數(shù)只負責(zé)調(diào)用函數(shù),實現(xiàn)代碼的核心邏輯,提高代碼的可維護性
    2021-08-08

最新評論

正镶白旗| 水富县| 聊城市| 九台市| 汕头市| 昌都县| 石林| 青冈县| 崇礼县| 忻州市| 阿拉善盟| 苏州市| 长泰县| 阳朔县| 阳谷县| 四会市| 南漳县| 诸暨市| 沁水县| 南宫市| 永仁县| 界首市| 肥东县| 湟中县| 宁远县| 邢台县| 宣恩县| 偏关县| 翁源县| 视频| 内乡县| 肃南| 武平县| 大英县| 泽州县| 禹州市| 富民县| 故城县| 射阳县| 会理县| SHOW|