棧---實現順序棧及簡單的括號匹配問題
棧
通常情況下,棧(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和