棧解決 括號匹配問題和逆波蘭表示式

2021-08-25 05:10:58 字數 3429 閱讀 7230

所需知識

字串

❀思路分析

有如下四組字串

如何檢測左右括號順序與個數是否匹配

char a = "(())abc";

char b = "(()))abc";

char c = "(()()abc";

char d = "(())abc";

1、解決:

(1)、當讀到乙個左括號的字元,包括『(』,『』,』]』時,檢測棧頂元素是否為與之匹配的左括號,若是,證明這一對括號匹配,將這個左括號出棧繼續檢測,檢測到其他字元,如字母數字,直接跳過,不做任何處理。

(2)、左右括號不匹配:如果檢測到右括號時,取棧頂元素中的左括號,發現不是與之對應的左括號,說明不匹配。

(3)、右括號比左括號多:如果檢測到右括號時,取棧頂元素中的左括號,發現棧已空,說明右括號多餘左括號。

(4)、左括號比右括號多:當所有字元都已經讀完,發現棧內仍有左括號,說明左括號比右括號多。

(5)、匹配成功:當中間無其他情況發生,且讀完字元後,棧為空,說明匹配成功。

2、具體實現

#include 

//括號匹配

#define max 20

typedef

char datatype;

typedef

struct stack

stack;

//初始化棧

void initstack(stack * s)

//取棧頂元素

datatype stacktop(stack * s)

return s->arr[s->top - 1];

}//清空棧

void empty(stack * s)

//入棧

void pushstack(stack * s, datatype c)

s->arr[s->top] = c;

s->top++;

}//判斷棧是否空,空返回1

int emptystack(stack *s)

//出棧

❀思路分析

以12*(3+4)-6+8/2 —–> 12 3 4 + *6 - 8 2/ +為例

(1)、讀到數字時,將數字壓棧

(2)、讀到+,-,*,/的操作符時,取出棧頂的前兩位數字,進行運算操作後,將其結果壓棧

具體實現

#ifndef __reverse_order_expression_h__

//逆波蘭表示式

//12*(3+4)-6+8/2 -----> 12 3 4 + *6 - 8 2/ +

#include

#include

#include

#define maxsize 15

typedef

enum operation

way;

typedef

int datatype;

typedef

struct cell

cell;

//進行逆波蘭填棧操作

//建立棧

typedef

struct stack

stack;

//棧的初始化

void initstack(stack * s)

//入棧

void pushstack(stack * s, datatype d)

s->data[s->top] = d;

s->top++;

}//取棧頂元素,並出棧

datatype topstack(stack *s)

s->top--;

return s->data[s->top];

}datatype order(cell arr,int size,stack *s)

case sub:

case mul:

case div:

case data:

default:}}

return topstack(s);

}int main()

, , ,

, , , , , , , };

int size = sizeof(arr) / sizeof(arr[0]);

initstack(&s);

printf("該表示式12*(3+4)-6+8/2 -----> 12 3 4 + *6 - 8 2/ +的值為%d \n", order(arr, size, &s));

利用棧解決括號匹配和逆波蘭表示式

當我們學習了棧這種資料結構滯後,我們就可以利用棧來解決一些實際問題。這裡是我們給出的動態順序棧的實現 template class t class stack void push const t data void pop bool empty t top t top const size t si...

括號匹配 逆波蘭函式(棧)

1.括號匹配 int isbrackets char ch 判斷括號函式 ch return0 void matchbrackets const char str ch stacktop s if ch str i ch str i str i 檢測當前括號是否與棧頂括號匹配 stackpop s ...

棧應用 括號匹配和逆波蘭表示式

stack宣告見前文 括號匹配 匹配串類似 abc 思路 乙個指標遍歷串,如是左括號入棧,右括號則出棧並於當前指標比較是否匹配。再指標指向 0,並且棧為空時才是匹配模式 匹配成功返回1 int match brackets const char string stack s init s 考慮左括號...