1. 程式人生 > >棧---實現順序棧及簡單的括號匹配問題

棧---實現順序棧及簡單的括號匹配問題

通常情況下,(Stack)可定義為只允許在表的末端進行插入和刪除的線性表。允許插入和刪除的一端稱作棧頂(top),不允許插入和刪除的一端稱作棧底(bottom)。當棧中沒有任何元素時則成為空棧。
這裡寫圖片描述

棧的分類

棧的抽象資料型別有兩種典型的儲存方式:

  • 順序棧:基於陣列的儲存表示
  • 鏈式棧:基於連結串列的儲存表達方式

程式碼實現

//順序棧的實現
#include<stdlib.h>
#include<iostream>
#include<assert.h>

using namespace std;
const int stackIncreament = 20
;//擴容大小 template<class T> class Stack { public: //建構函式 Stack(int sz = 50) { top = -1; maxSize = sz; elements = new T[maxSize]; assert(elements != NULL); } ~Stack() //解構函式 { delete[]elements; } void push(const
T& x); //壓棧操作 bool pop(T& x); //出棧操作 bool getTop(T& x) //取棧頂元素 { if (IsEmpty() == true) return false; x = elements[top]; return true; } //判空 bool IsEmpty()const { return (top == -1) ? true
: false; } //判滿 bool IsFull()const { return (top == maxSize - 1) ? true : false; } //返回棧中元素個數 int getSize()const { return top + 1; } //將棧置空 void makeEmpty() { top = -1; } private: T *elements; //存放棧中元素的棧陣列 int top; //棧頂指標 int maxSize; //棧最大可容納元素個數 void overFloeProcess(); //棧的溢位處理 }; //私有函式,擴充棧的儲存空間 template<class T> void Stack<T>::overFloeProcess() { T * newArray = new T[maxSize + stackIncreament]; if (newArray == NULL) { cerr << "記憶體分配失敗!" << endl; exit(1); } for (int i = 0; i <= top; i++) { newArray[i] = elements[i]; } maxSize += stackIncreament; delete[]elements; } //壓棧操作 template<class T> void Stack<T>::push(const T& x) { while (IsFull() == true){ overFloeProcess(); } elements[++top] = x; } //出棧操作 template<class T> bool Stack<T>::pop(T& x) { if (IsEmpty() == true) return false; x = elements[top--];//返回棧頂元素值 return true; } //括號匹配 void PrintMatchedPairs(char * exprssion, int size) { if (exprssion == NULL) return; Stack<int> s(size); int x;//pop返回的值 int n;//棧中元素的個數 for (int i = 1; i <= size; i++) { if (exprssion[i-1] == '(') s.push(i); else if (exprssion[i-1] == ')') { if (s.pop(x) == true) cout << x << " 與 " << i << "匹配" << endl; else cout << "沒有與第" << i << "個右括號匹配的左括號!" << endl; } } while (s.IsEmpty() == false) { s.pop(x); cout << "沒有與第" << x << "個右括號匹配的左括號!" << endl; } } int main() { char * c = "(0)ii(ooio(o)))"; cout << strlen(c) << endl; PrintMatchedPairs(c, strlen(c)); return 0; }

棧的靈活運用之括號配對

在一個字串”(a * (b + c) - d)”中,位置1的左括號與位置8的右括號匹配,位置4的左括號和位置11的右括號匹配。
在字串”(a + b)(“中,位置6的左括號沒有右括號與之匹配。
利用棧的知識,我們就能輕鬆地找到已經匹配的左右括號和還未匹配的左右括號。
思路分析
迴圈遍歷字串,遇到’(‘將位置資訊push,遇到’)’將棧頂的資料pop,由於棧的先進後出規則,pop操作得到的資訊是與之匹配的左括號的位置。
首先遇到右括號,pop會返回false,接收false並進行處理。
字串讀完後棧不為空,依次出棧並顯示資訊,直到棧為空。

//括號匹配
void PrintMatchedPairs(char * exprssion, int size)
{
    if (exprssion == NULL)
        return;
    Stack<int> s(size);
    int x;//pop返回的值
    int n;//棧中元素的個數
    for (int i = 1; i <= size; i++)
    {
        if (exprssion[i-1] == '(')
            s.push(i);
        else if (exprssion[i-1] == ')')
        {
            if (s.pop(x) == true)
                cout << x << " 與 " << i << "匹配" << endl;
            else
                cout << "沒有與第" << i << "個右括號匹配的左括號!" << endl;
        }
    }
    while (s.IsEmpty() == false)
    {
        s.pop(x);
        cout << "沒有與第" << x << "個右括號匹配的左括號!" << endl;
    }
}

相關推薦

---實現順序簡單括號匹配問題

棧 通常情況下,棧(Stack)可定義為只允許在表的末端進行插入和刪除的線性表。允許插入和刪除的一端稱作棧頂(top),不允許插入和刪除的一端稱作棧底(bottom)。當棧中沒有任何元素時則成為空棧。 棧的分類 棧的抽象資料型別有兩種典型的儲存

C語言實現順序括號匹配

//順序棧的使用舉例:括號的匹配 #include <stdio.h> #include <stdlib.h> #define OK      1 #define ERROR   0 #define TRUE    1 #define FALSE  

順序儲存實現(一)

繼續學習資料結構,今天我們來學習棧的相關知識。其實學習沒有捷徑,如果抱著一種吃快餐的態度進行學習,那是學不到東西,各種技術都是淺嘗輒止,那註定學習是不會有太大的效果。不知道你們討不討厭 某某語言從入門到精通的這類書籍?我在想,有這麼牛逼麼,一本書直接都從入門到精通了,只不是

順序結構實現

棧是線性表的一種特例,其後進先出的資料結構在開發中比較常見。許多軟體、應用都提供撤銷的操作(ctrl+z),其實現原理就是使用了棧的資料結構。 棧是限定僅在表尾進行插入和刪除操作的線性表。 通常把允許插入和刪除的一端稱為棧頂(top),另外一端稱為棧底(bo

資料結構實驗3:C++實現順序類與鏈

                          

leetcode 20 簡單括號匹配(C++和python實現)

【題目描述】 給定一個只包括 '(',')','{','}','[',']' 的字串,判斷字串是否有效。 有效字串需滿足: 左括號必須用相同型別的右括號閉合。 左括號必須以正確的順序閉合。 注意空字串可被認為是有效字串。

Java程式碼實現順序和鏈式

Java程式碼實現順序棧和鏈式棧 棧(stack)又名堆疊,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入或者刪除運算。後進先出(Last In First Out)。 棧中的資料操作主要有push(壓入)和pop(彈出)操作。 實際上,棧就可以用陣列來實現,也可

C語言實現順序的初始化&進&出&讀取頂元素

/*順序表實現棧的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define Stack_Size 50 //設棧中元素個數為50 #define OK 1 #define ERROR 0

實現(順序結構)

順序結構 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define STACK_SIZE 100 typedef int ElemType; typedef enum

資料結構筆記之用C++實現順序和鏈式

這裡介紹兩種實現棧的方式:“順序棧”和“鏈式棧”,各有各的優缺點。 不管是“順序棧”還是“鏈式棧”,我們可以先定義一個棧的ADT(抽象資料型別),如下面的“stack.h” #ifndef STACK_H #define STACK_H const int

資料結構-的應用-算術表示式小括號匹配

資料結構高分筆記,第3章《棧》的第一個例題,題目要求檢測算術表示式中小括號匹配是否合法。感覺自己的演算法還是有點弱智啊,這麼多判斷好像很low逼!!!! #include <stdio.h> #include <string.h> #define

實現順序各種基本運算演算法

//SeqStack.htypedef char ElemType; #define MaxSize 100 typedef struct { ElemType data[MaxSize];

c語言實現順序的基本功能

#include<stdio.h> #include<stdlib.h> #define maxsize 100 typedef struct SqStack{ int data[maxsize]; int top; }SqStack,*pSqStac

C語言實現順序的基本操作

//標頭檔案內容//--------------------棧的順序儲存結構-------------------- #define STACK_INIT_SIZE 100 #define STACKINCREACE 10 typedef int Elemtype;//在

c++ 實現順序類(初始化,入,退。讀頂元素以及順序輸出頂指標與中的元素

/* 定義順序棧類(初始化,入棧,退棧。讀棧頂元素以及順序輸出棧頂指標與棧中的元素 */ #include<iostream> using namespace std; // template <class T> class sq_Stack {

C++實現順序

棧是一種特殊的線性表,其插入和刪除操作只能在一端進行(棧頂),具有後進先出的特點。 棧的實現 #include<iostream> #include<assert.h> using namespace std; templat

C#實現順序

1. BCL中順序棧    BCL中有Stack,實現了棧的操作。1.1 Program.csusing System; using System.Collections.Generic; using System.Linq; using System.Text; using

資料結構 順序,鏈式,用實現計算器)

一、棧的概念 1. 棧是一個特殊的線性表,只能在一端操作:棧頂(top):允許操作 的一端                                                                     棧底(bottom):不允許操作的一端 2

順序,鏈

順序棧 順序棧是指利用順序儲存結構實現的棧,即利用一組地址連續的儲存單元依次存放自棧底到棧頂的資料元素。 程式碼實現如下: #include <iostream> #include <stdio.h> #include <malloc.h> usi

HashMap實現原理分析簡單實現一個HashMap

HashMap實現原理分析及簡單實現一個HashMap 歡迎關注作者部落格 簡書傳送門 轉載@原文地址   HashMap的工作原理是近年來常見的Java面試題。幾乎每個Java程式設計師都知道HashMap,都知道哪裡要用HashMap,知道HashMap和