剑指offer 22---判断元素出栈、 入栈顺序的合法性

来源:互联网 发布:linux qt调试器未设置 编辑:程序博客网 时间:2024/06/05 14:33

题目:

判断元素出栈、 入栈顺序的合法性。 如: 入栈的序列(1,2,3,4,5) , 出栈序列为(4,5,3,2,1) 是合法序列, 入栈的序列(1,2,3,4,5) , 出栈序列为(1,5,3,2,4) 是不合法序列。

代码实现如下:

#include <iostream>#include <assert.h>#include <stack>#include <Windows.h>using namespace std;//判断合法性bool IsLegal(int* stackin, int* stackout, int lenin, int lenout)     //入栈序列,出栈序列,入栈长度,出栈长度{assert(stackin && stackout);   //先判断出栈序列,入栈序列不为空if (lenin != lenout)    //出栈长度和入栈长度不相等,不合法{return false;}stack<int> qq;int i = 0;int j = 0;for (; i < lenin; ++i){qq.push(stackin[i]);        //先将元素一 一入栈while (qq.size() > 0 && qq.top() == stackout[j])      //上述代码在入栈,所以元素个数一定大于0,并且每次栈顶均要和出栈序列一一匹配,否则不合法{qq.pop();++j;}}return (qq.size() == 0) ? true : false;     //程序运行到此处时,栈中应该为空,否则不合法}

测试题目中第一个序列:

#include "Stack.h"void TestStack(){int stackin[] = { 1, 2, 3, 4, 5 };   //入栈序列int stackout[] = { 4, 5, 3, 2, 1 };   //出栈序列int lenin = sizeof(stackin) / sizeof(stackin[0]);int lenout = sizeof(stackout) / sizeof(stackout[0]);int www = IsLegal(stackin, stackout, lenin, lenout);if (www){cout << "出栈序列合法" << endl;}else{cout << "出栈序列不合法" << endl;}}int main(){TestStack();system("pause");return 0;}

测试第二个序列:

#include "Stack.h"void TestStack(){int stackin[] = { 1, 2, 3, 4, 5 };   //入栈序列int stackout[] = { 1, 5, 3, 2, 4 };   //出栈序列int lenin = sizeof(stackin) / sizeof(stackin[0]);int lenout = sizeof(stackout) / sizeof(stackout[0]);int www = IsLegal(stackin, stackout, lenin, lenout);if (www){cout << "出栈序列合法" << endl;}else{cout << "出栈序列不合法" << endl;}}int main(){TestStack();system("pause");return 0;}


2 0
原创粉丝点击