今天面試的時候被面試官問到棧操作,當時回答的不是很好,回來後查資料自己總結了一下。
括號匹配是棧的一個重要的應用。具體做法:對輸入的字符串進行篩選,找出其中的括號入棧。對於匹配的括號,不管有多複雜,總是先對緊鄰的兩個括號進行匹配的,
如:({ } { [ ( ) ]。首先第一個‘(’入棧,當下一個括號不是右括號(即“)]}”),繼續‘{’入棧,當遇到‘}’時,彈出棧頂的 ‘{‘與此時的‘}’進行比較,匹配則繼續,不匹配則停止,給出不匹配的括號,如此下去直到全部處理完所有的括號,檢查棧是否爲空,判斷最終是否匹配成功。
#include "stdafx.h"
#include <iostream>
using namespace std;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define ERROR 0
#define CONVERSION_NUM 8
typedef int SElemType;
typedef int Status;
typedef struct{
SElemType *base;
SElemType *top;
int stackSize;
}stack;
stack s; //全局變量,棧
Status InitStack(stack &s){
s.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!s.base){ cout << "內存不足!" << endl; return ERROR; }
s.top = s.base;
s.stackSize = STACK_INIT_SIZE;
return OK;
}
bool StackEmpty(stack s){
if (s.base == s.top) return true;
else return false;
}
Status Push(stack &s, SElemType e){
if (s.top - s.base >= s.stackSize){
s.base = (SElemType*)realloc(s.base, (s.stackSize + STACKINCREMENT) * sizeof(SElemType));
if (!s.base){ cout << "內存不足!" << endl; return ERROR; }
s.stackSize = s.stackSize + STACKINCREMENT;
}
*s.top = e;
s.top++;
return OK;
}
Status Pop(stack &s, SElemType &e){
if (s.base == s.top){ cout << "棧爲空!" << endl; return ERROR; }
s.top--;
e = *s.top;
return OK;
}
int _tmain(int argc, _TCHAR* argv[])
{
InitStack(s);
char *p;
int e;
p = (char *)malloc(sizeof(char)* 100);
cout << "輸入包含括號的表達式:"<<endl;
while (gets(p)){
/*處理過程 篩選出字符串中的括號 是左括號就入棧 遇到右括號就出棧,並將棧頂元素賦值給變量e,這時比較e與此時的右括號,
若同爲() 或 [] 或 {} 則匹配成功 否則 匹配失敗
*/
while (*p){
switch (*p)
{
case '(':Push(s, *p++); break; //左括號則入棧,p指針往後移動
case '[':Push(s, *p++); break;
case '{':Push(s, *p++); break;
case ')':
Pop(s, e);
if (e == '(') p++;
else { cout << "')'匹配失敗" << endl; exit(OVERFLOW); }
break;
case ']':
Pop(s, e);
if (e == '[') p++;
else { cout << "']'匹配失敗" << endl; exit(OVERFLOW); }
break;
case '}':
Pop(s, e);
if (e == '{') p++;
else { cout << "'{'匹配失敗" << endl; exit(OVERFLOW); }
break;
default:p++;
break;
}
}
if (StackEmpty(s))cout << "匹配成功!" << endl;
else cout << "匹配失敗,缺少右括號!" << endl;
cout << "輸入包含括號的表達式:" << endl;
}
system("pause");
return 0;
}