刚刚做数据结构作业时有这样一道书本习题,题目如下:
3.2 假设以I和O分别表示进栈和出栈操作,栈的初态和终栈均为空,进栈和出栈的操作序列可表示为仅由I和O组成的序列。
(1)下面所示的序列中哪些是合法的?
A. IOIIOIOO B. IOOIOIIO C. IIIOIOIO D. IIIOOIOO
(2)通过对(1)的分析,写出一个算法判定所给的操作序列是否合法。若合法则返回1;否则返回0.(假设被判定的操作序列已存入一位数组中)。
第一题思考了一下,AD
第二题本来想用栈来做,但似乎又没有必要……我直接用了一个int变量count来代替栈,代码如下(C++):
1 #include<iostream> 2 #include<cstring> 3 /* 4 Name: stack operate sequence legal judge 5 Copyright: guoji 6 Author: guoji 7 Date: 11/10/15 18:40 8 Description: 9 */ 10 11 using namespace std; 12 13 bool judge(char *arr, int n) 14 { 15 int count = 0; 16 for (int i = 0; i < n; i++) { 17 if (arr[i] == ‘I‘) { 18 count++; 19 } 20 else if (arr[i] == ‘O‘) { 21 if (count == 0) 22 return 0; 23 else 24 count--; 25 } 26 else { // illegal Character 27 return 0; 28 } 29 } 30 31 return (count == 0); 32 } 33 34 35 int main() 36 { 37 string input; 38 39 cin >> input; // input from keyboard 40 41 char *operate = new char[input.length()]; 42 strcpy(operate, input.c_str()); // string to char array 43 44 cout << "result: " << judge(operate, input.length()) << endl; 45 // print the judge redult 46 47 return 0; 48 }
用第一题的数据测试了一下没什么问题。做完作业后想自己写一下括号匹配,等等,刚刚的第二题怎么有点……熟悉?这和括号匹配有点像啊,简直就是括号匹配另一种版本:“I-O”匹配!!!于是改了下判断的函数,“I"用左括号”("替代,”O"用右括号“)”替代,去掉非法字符判断……
1 bool judge(char *arr, int n) 2 { 3 int count = 0; 4 for (int i = 0; i < n; i++) { 5 if (arr[i] == ‘(‘) { 6 count++; 7 } 8 else if (arr[i] == ‘)‘) { 9 if (count == 0) 10 return 0; 11 else 12 count--; 13 } 14 } 15 16 return (count == 0); 17 }
写几个表达式测试了一下,可以判断。
思路分析:由于只需要进行进栈出栈操作而不涉及具体的元素,结果也是根据栈是否为空来判断,所以可以用一个int变量代替栈,用自加和自减代替进栈和出栈操作,变量为0表示栈为空。但这种写法只能识别一种括号(字符),而且怎么感觉没有使用栈那么严谨,拿来玩玩应付功课应该还是可以...
时间: 2024-10-21 22:50:45