1. 程式人生 > >棧及棧運用之括號匹配

棧及棧運用之括號匹配

棧的定義及儲存
只能在固定一端進行插入和刪除操作的線性結構。進行插入刪除操作的一端稱為棧頂,另一端稱為棧底,插入資料的操作稱為壓棧,刪除資料的操作稱為出棧。
棧的儲存結構有順序棧和鏈鏈兩種。
順序棧和順序表基本一樣,不同的是順序棧只能固定在棧頂進行操作。順序棧除了單個棧外還有共享棧,所謂共享棧就是兩個棧共用一快儲存空間,當然共享棧一般用於兩個棧空間需求相反的情況下,比如一個增加一個減少,這就可以用共享棧了。
鏈棧可用單鏈表實現,一般將連結串列的頭作為棧頂,連結串列的尾部作為棧底,這種情況下采用首插和首刪法將比尾插和尾刪更高效,因此在鏈棧中採用首插和首刪法進行進棧和出棧的操作。
那麼這兩種儲存方式哪種好一些呢?就進行時間複雜度比較而言兩種方式都差不多,然而我們知道連結串列在記憶體中儲存是碎片化的,所以比較浪費空間,因此就空間儲存上順序棧要優越一點。因此我們在這裡實現一個順序棧,並用實現的順序棧做一個例項—–括號匹配。
順序棧的實現


棧的基本操作有入棧、出棧、判空、取棧頂元素、計算棧內元素個數。下面我們用C++語言來實現:

template<typename T>
class Stack
{
public:
    Stack()
        :_array(NULL)
        ,_size(0)
        , _capacity(0)
    {}
    ~Stack()
    {
        if (_array)
        {
            delete[] _array;
        }
    }
    void Push(const
T& data) { CheckCapacity(); _array[_size++] = data; } void Pop() { if (!Empty()) { _size--; } } T& Top() { assert(_size != 0); return _array[_size-1]; } T& Top()const { assert
(_size != 0) return _array[_size-1]; } size_t Size()const { return _size; } bool Empty()const { return !_size; } private: void CheckCapacity() { if (_size == _capacity) { _capacity = _capacity * 2 + 3; T *ptemp = new T[_capacity]; if (_size) { for (size_t i = 0; i < _size; i++) { ptemp[i] = _array[i]; } delete[] _array; } _array = ptemp; } } T* _array; size_t _capacity; size_t _size; };

這裡寫了一個模板類,當用某個型別來對這個模板進行例項化後就可以對這個棧進行壓棧和出棧操作了。下面我們來用用這個棧——括號匹配。
棧的簡單運用之括號匹配
這裡的括號以C++程式中常用的三種括號()、[]、{}為例,我們要用程式來判斷一段字串的括號匹配是否正確。
括號通常有四種情況:
(1)、左括號多了。
(2)、右括號多了。
(3)、括號順序錯了。
(4)、括號匹配正確。
下面給出實現程式碼:

bool MatchBrackets(char* pStr)
{
    assert(pStr != NULL);
    Stack<char> stack_char;
    size_t len = strlen(pStr);
    for (size_t i = 0; i < len; i++)
    {
        if (pStr[i] != '(' && pStr[i] != ')'&&
            pStr[i] != '[' && pStr[i] != ']'&&
            pStr[i] != '{' && pStr[i] != '}')
            continue;
        if (pStr[i] == '(' || pStr[i] == '[' || pStr[i] == '{')
        {
            stack_char.Push(pStr[i]);
        }
        else
        {
            if (stack_char.Empty())
            {
                cout << "右括號多了" << endl;
                return false;
            }
            char ch = stack_char.Top();
            if (ch == '(' && pStr[i] == ')' ||
                ch == '['&&pStr[i] == ']' ||
                ch == '{'&&pStr[i] == '}')
            {
                stack_char.Pop();
            }
            else
                return false;
        }
    }
    if (!stack_char.Empty())
    {
        cout << "左括號多了" << endl;
        return false;
    }
    return true;
}

當括號匹配成功時就返回true,否則返回false,我們來看看測試:
先給出左括號多的例子:
void test1()
{
char str[] = “abc{cd(dfsfs[fksd]}”;
if (MatchBrackets(str))
cout << “匹配正確”;
}
這裡寫圖片描述

再給出右括號多的情況:

void test2()
{
    char str[] = "abc{cd(dfs)fs[fksd]}}";
    if (MatchBrackets(str))
        cout << "匹配正確";
}

這裡寫圖片描述

匹配錯誤:

void test2()
{
    char str[] = "abc{cd(dfs)f)s[fksd]}";
    if (MatchBrackets(str))
        cout << "匹配正確";
    else
        cout << "匹配錯誤";
}

這裡寫圖片描述
正確匹配:

void test2()
{
    char str[] = "abc{cd(dfs)fs[fksd]}";
    if (MatchBrackets(str))
        cout << "匹配正確";
    else
        cout << "匹配錯誤";
}

這裡寫圖片描述

以上就是棧的描述及棧的簡單運用—括號匹配,在後面的文章會運用棧來進行更深一點的運用。歡迎各位勘誤。

相關推薦

運用括號匹配

棧的定義及儲存 只能在固定一端進行插入和刪除操作的線性結構。進行插入刪除操作的一端稱為棧頂,另一端稱為棧底,插入資料的操作稱為壓棧,刪除資料的操作稱為出棧。 棧的儲存結構有順序棧和鏈鏈兩種。 順序棧和順序表基本一樣,不同

和佇列應用括號匹配

一.題目描述 假設一個表示式或一段程式中含有三種括號:圓括號“(”和“)”、方括號“[”和“]”、花括號“{”和“}”。試寫一個程式判別給定的表示式或程式中所含括號是否正確配對出現。 輸入說明: 多組輸入資料,第1行為1個正整數n,表明有n組測試資料;其餘n行為n組測試資料

應用 括號匹配問題(Python 版)

text 所有 != parent else 括號 check style pan 棧應用之 括號匹配問題(Python 版) 檢查括號是否閉合 循序掃描被檢查正文(一個字符)裏的一個個字符 檢查中跳過無關字符(所有非括號字符都與當前處理無關) 遇到開括號將其壓入棧 遇到

資料結構實驗與佇列四:括號匹配(SDUT 2134)

#include <bits/stdc++.h> using namespace std; typedef long long ll; char s[100]; char a[100]; int main() { int i,j,k,f,top,len; while(

資料結構學習筆記(含數制轉換,括號匹配,表示式求值轉逆波蘭)

#include <iostream> #include <cstring> #include <ctype.h> #include <string> #include <cstring> #include <

資料結構實驗與佇列四:括號匹配

#include <stdio.h> #include <stdlib.h> #include <string.h> #define Stackmax 100 #define Stackincrement 10 #define

的應用括號匹配

在許多正文中都有括號,特別是在表示程式、數學表示式的正文片段裡,括號有正確配對問題。作為例子,下面考慮python程式裡的括號,在這裡可以看到: 存在多種不同的括號,下面只考慮其中三種:圓括號、方括號和花括號。 每種括號都包括一個開括號和一個閉括號,相互對應。括號括起的片

的應用括號匹配問題

給一個字串,那這個程式是可以檢測你的字串中所含的括號是否匹配。 原理是:我們從左向右遍歷字串,如果我們遇到左括號如‘(’,我們就將這個左括號進棧,如遇到右括號‘(’,我們就將棧頂元素與該右括號比較,看

資料結構(C語言)讀書筆記6:的應用括號匹配的C程式碼實現

括號匹配的演算法思想: 初始化一個空棧,掃描表示式,依次讀入字元,知道掃描完或者出現錯誤匹配。對於讀入的每個字元,分以下情況處理: (1)、如果是‘’(“”或“【”,將其壓入棧。 (2)、如果是“)”,則根據當前棧頂元素的值分情況考慮。若棧頂元素是“(”,則匹配成功,否則為

的應用括號匹配檢驗

        棧結構具有後進先出的固有特性,在程式設計中很有幫助。這裡舉一個例子,將棧應用與括號匹配的檢驗。         假設表示式中允許三種括號:小括號、中括號和大括號,巢狀的順序任意。( [ ] ) { } 、[ { } ]等均為正確格式。檢驗括號是否匹配可用“期

應用括號匹配

此程式碼僅為棧的簡單應用,對括號匹配問題做出了描述,棧的更多用途表示式求值將在後面推出 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OVERFLOW -1 #define OK

2134 資料結構實驗與佇列四:括號匹配

資料結構實驗之棧與佇列四:括號匹配 Time Limit: 1000MS Memory Limit: 65536KB Problem Description  給你一串字元,不超過50個字元,可能包括括號、數字、字母、標點符號、空格,你的任務是檢查這一串字元中的( )

C語言 順序使用括號匹配

//順序棧的使用舉例:括號的匹配 //作者:nuaazdh //時間:2011年12月5日 #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #de

SDUT 2134 資料結構實驗與佇列四:括號匹配

#include <iostream> #include <bits/stdc++.h> using namespace std; const int MAXN=10000; char s[MAXN]; char st[MAXN]; int main() { while(ge

c的應用括號匹配

原理比較簡單,思路也很簡單,拿其複習一下資料結構 直接將程式碼粘上,望大家多提寶貴意見:) bracketMatch.h /** *問題描述:括號包括 圓括號,方括號,花括號三種 ,編寫一個判別表示式中括號是否正確配對的函式 *四種配對情況: *1、左右括號配對次序不正確

簡單的應用括號匹配

常常我們在寫程式時,編譯程式碼能發現我們括號匹配正確與否,今天我們模擬實現一個簡單的括號匹配函式,用以複習棧的引用 #include<iostream> #include<st

的應用:表示式括號匹配檢測(C)

問題說明: 假設數學表示式中允許包含兩種括號:圓括號“()”和方括號“[]”,巢狀順序任意。 正確的巢狀模式:( [ ] ( ) )、[ ( [ ] [ ] ) ] 正確的表示式例:(a+b)[c*(d-e)] 錯誤的巢狀模式:[ ( ] )、( ( ) ]   比如,在處理表達式(A)

的應用舉例:括號匹配(C#)

假設表示式允許包含兩種括號:圓括號和方括號,其巢狀的順序隨意,即[ ( [ ] ( ) ) ]等為正確的格式,[ ( ]或( ( [ ) )為錯誤的格式。檢驗括號是否匹配的方法可用“期待的急迫程度”這個概念描述。 當計算機接收左括號時,括號入棧,當計算機接收右括

資料結構(1)——順序的實現,以及括號匹配的應用

為什麼從堆疊開始?因為我覺得線性部分比較簡單的是堆疊和佇列,用得也比較多,有不少人覺得連結串列才簡單啊,其實連結串列簡單嗎?連結串列可以派生的東西反而很多,不是一時半會可以理解的,還記得在一篇微軟的招聘心得回顧文上看到,微軟的面試官就問他怎樣用兩個連結串列實現一個棧。當然,

的鏈式儲存結構(鏈)

棧:線性結構,後進先出。棧(Stack)是一種特殊的線性表(順序表,連結串列)只在表尾進行刪除和插入操作。 注意:對於棧來說,表尾稱為棧的棧頂(top),表頭稱為棧底(bottom)。 棧也是線性結