zoukankan      html  css  js  c++  java
  • (数据结构整理)NJUPT1054

        这一篇博客以一些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.
    ");
    		}else{
    			printf("Bingle! Palindrome.
    ");
    		}
    	}
    
    	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.
    ");
    	}else{
    		printf("Not Palindrome.
    ");
    	}
    
    }
    
    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
    ");
    		} else {
    			printf("YES
    ");
    		}
    	}
    
    	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
    ");
    		}else{
    			printf("No
    ");
    		}
    	}
    
    	return 0;
    }
    









  • 相关阅读:
    Node.js配置And HelloWorld
    谷歌浏览器扩展插件
    C#异步编程简单的运用
    C#中的特性基本理解
    JavaScript 字符 &quot;转换
    IHttpModule
    LinqToXml
    C#使用ajaxForm进行上传图片
    python 中的 __getitem__, __iter__ 和__next__
    python中的装饰器
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7027190.html
Copyright © 2011-2022 走看看