今天面试的时候被面试官问到栈操作,当时回答的不是很好,回来后查资料自己总结了一下。
括号匹配是栈的一个重要的应用。具体做法:对输入的字符串进行筛选,找出其中的括号入栈。对于匹配的括号,不管有多复杂,总是先对紧邻的两个括号进行匹配的,
如:({ } { [ ( ) ]。首先第一个‘(’入栈,当下一个括号不是右括号(即“)]}”),继续‘{’入栈,当遇到‘}’时,弹出栈顶的 ‘{‘与此时的‘}’进行比较,匹配则继续,不匹配则停止,给出不匹配的括号,如此下去直到全部处理完所有的括号,检查栈是否为空,判断最终是否匹配成功。
#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;
}