(数据结构整理)NJUPT1054

来源:互联网 发布:阿里云账号 编辑:程序博客网 时间:2024/06/03 08:20

    这一篇博客以一些OJ上的题目为载体,整理一下数据结构。会陆续的更新。。。

    我们都知道,数据结构的灵活应用有时能让简化一些题目的解答。

 

    一、栈的应用

     1、NJUPT OJ 1054(回文串的判断)

     回文串的判断:将一个字符串的一半存入一个栈中,然后从栈顶开始判断这个字符串是否是回文串

     

/* * NJUPTOJ_1054.cpp * *  Created on: 2014年5月22日 *      Author: pc */#include <iostream>#include <cstdio>using namespace std;const int maxn = 300;void toLower(char arr[],int len){int i;for(i = 0 ; i < len ; ++i){if(!islower(arr[i])){arr[i] += 32;}}}int main(){char a[maxn];char s[maxn];while(gets(a)!=NULL){int len = strlen(a);toLower(a,len);int mid = len/2 - 1;int top = 0;int i;for(i = 0 ; i <= mid ; ++i){s[++top] = a[i];}int next;if(len%2 == 0){next = mid+1;}else{next = mid+2;}for(i = next ; i <= len-1 ; ++i){if(s[top] != a[i]){break;}--top;}if(top != 0){printf("Not Palindrome.\n");}else{printf("Bingle! Palindrome.\n");}}return 0;}


以下是再次做这道题时的代码:

/* * njupt_1054_1.cpp * *  Created on: 2014年9月6日 *      Author: pc */#include <iostream>#include <cstdio>using namespace std;const int maxn = 300;/** * 将一个字符串转化成小写 */void toLower(char a[]){int len = strlen(a);int i;for(i = 0 ; i < len ; ++i){if(islower(a[i]) == false){a[i] += 32;}}}void work(char a[]){int len = strlen(a);int s[len];/** *关于mid和next额理解: *mid: 用来标记开始比较时栈顶的第一个元素 *next: 用来比较剩下的一半的字符串中开始比较时的第一个元素的位置 */int mid = len/2 - 1;int next;if(len%2 == 0){next = mid+1;}else{next = mid+2;}int top = 0;int i;for(i = 0 ; i <= mid ; ++i){s[++top] = a[i];}for(i = next ; i <= len-1 ; ++i){if(s[top] != a[i]){break;}--top;}if(top == 0){printf("Bingle! Palindrome.\n");}else{printf("Not Palindrome.\n");}}int main(){char s[maxn];/** * 不知道行数时的输入的处理方式... */while(gets(s) != NULL){toLower(s);work(s);}return 0;}



2、NEFU OJ 194 回文字符串

算法思想和上面的是一样的

/* * NEFU_194.cpp * *  Created on: 2014年5月23日 *      Author: pc */#include <iostream>#include <cstdio>using namespace std;string a;string s;int main() {int t;scanf("%d", &t);while (t--) {cin >> a;int len = a.length();int mid = len / 2 - 1;int top = 0;int i;for (i = 0; i <= mid; ++i) {top += 1;s[top] = a[i];}int next;if (len % 2 == 0) {next = mid + 1;} else {next = mid + 2;}for (i = next; i <= len - 1; ++i) {if (s[top] != a[i]) {break;}--top;}if (top != 0) {printf("NO\n");} else {printf("YES\n");}}return 0;}


3、NYOJ 1002 括号的匹配

思想:如果输入的符号是(、[则直接进栈,如果是],则判断此事最后一个是否是[,如果是[出栈,否则]进栈

/* * NY_2_1.cpp * *  Created on: 2014年5月25日 *      Author: pc */#include <iostream>#include <cstdio>#include <stack>using namespace std;int main(){string a;int t;scanf("%d",&t);while(t--){stack<char> s;cin >> a;int len = a.length();int i;for(i = 0 ; i < len ; ++i){if(a[i] == '(' || a[i] == '['){s.push(a[i]);}else if(a[i] == ')'){if(!s.empty() && s.top() == '('){s.pop();}else{s.push(a[i]);}}else if(a[i] == ']'){if(!s.empty() && s.top() == '['){s.pop();}else{s.push(a[i]);}}}if(s.empty()){printf("Yes\n");}else{printf("No\n");}}return 0;}









7 0
原创粉丝点击