1. 程式人生 > >CSU 1182: 表示式 1183: 計算表示式的值 1184: 格林布的地雷

CSU 1182: 表示式 1183: 計算表示式的值 1184: 格林布的地雷


#include <stdio.h>
#include <string.h>
#define INI 0
#define NUM 1
#define OPT 2
#define WRN -1
#define N 1024
int table[4][130];
char s[N];
int n;
void init()
{
    int state,ch;
    memset(table,0xff,sizeof(table));
    for(ch='0';ch<='9';ch++)    table[INI][ch]=table[NUM][ch]=table[OPT][ch]=NUM;
    table[INI]['+'
]=OPT; table[INI]['-']=OPT; table[NUM]['+']=OPT; table[NUM]['-']=OPT; table[NUM]['*']=OPT; table[NUM]['/']=OPT; } int dfa(int a,int b) { int i,j,state=INI; if(a>b) return WRN; for(i=a;i<=b;i++) { if(s[i]==' ' || s[i]=='\t') continue; if(s[i]=='('
) { if(state==NUM) return WRN; int cnt=1; for(j=i+1;j<=b;j++) { if(s[j]=='(') cnt++; else if(s[j]==')') cnt--; if(cnt==0) break; } if(cnt || dfa(i+1,j-1)!=NUM) return
WRN; state=NUM; i=j; } else state=table[state][s[i]]; if(state==WRN) return WRN; } if(state==NUM) return NUM; return WRN; } int main() { init(); while(gets(s)) { n=strlen(s); if(n==0) puts(""); else printf("%s\n",dfa(0,n-1)==NUM?"Yes":"No"); } return 0; } /********************************************************************** Problem: 1182 User: 3901140225 Language: C++ Result: AC Time:0 ms Memory:1124 kb **********************************************************************/

#include <stdio.h>
#define MAX (100 + 10)
char szData[MAX];

void TrimSpace(char* pszData)
{
    char* pszRead = pszData;
    char* pszWrite = pszData;
    while (*pszRead)
    {
        //由於資料中有\t,與先前題目描述不符合,不處理掉就直接超時了
        if (*pszRead != ' ' && *pszRead != '\t')
        {
            *pszWrite++ = *pszRead;
        }
        ++pszRead;
    }
    *pszWrite = '\0';
}

//nKind代表前一個運算符合的優先順序,開始時是0,+-是1,*/是2
double Cal(char*& pszData, int nKind)
{
    double fAns = 0.0;
    while (*pszData && *pszData != ')')//表示式終止的條件是到達'\0'或者碰到右括號
    {
        if (*pszData >= '0' && *pszData <= '9')
        {
            fAns = 10 * fAns + *pszData - '0';
            ++pszData;
        }
        else if (*pszData == '+')
        {
            if (nKind >= 1)
            {
                return fAns;
            }
            ++pszData;
            fAns += Cal(pszData, 1);
        }
        else if (*pszData == '-')
        {
            if (nKind >= 1)
            {
                return fAns;
            }
            ++pszData;
            fAns -= Cal(pszData, 1);
        }
        else if (*pszData == '*')
        {
            if (nKind >= 2)
            {
                return fAns;
            }
            ++pszData;
            fAns *= Cal(pszData, 2);
        }
        else if (*pszData == '/')
        {
            if (nKind >= 2)
            {
                return fAns;
            }
            ++pszData;
            fAns /= Cal(pszData, 2);
        }
        else if (*pszData == '(')
        {
            ++pszData;
            fAns = Cal(pszData, 0);
            ++pszData;//移到')'後面
            return fAns;//一個括號內的是一個完整的表示式,因此直接返回
        }
    }
    
    return fAns;
}

int main()
{
    while (gets(szData))
    {
        TrimSpace(szData);
        char* pszData = szData;
        printf("%.4f\n", Cal(pszData, 0));
    }
}
/**********************************************************************
	Problem: 1183
	User: 3901140225
	Language: C++
	Result: AC
	Time:0 ms
	Memory:1120 kb
**********************************************************************/

#include <stdio.h>
#include <string.h>
#define MAX(a,b) ((a)>(b)?(a):(b))
#define N 501
int n,m,g[N][N],d[N],path[N],top;
void dfs(int u)
{
    int v;
    for(v=1;v<=n;v++)
    {
        if(g[u][v])
        {
            g[u][v]--;
            g[v][u]--;
            dfs(v);
        }
    }
    path[top++]=u;
}
int main()
{
    int i,a,b,start;
    while(~scanf("%d",&m))
    {
        memset(g,0,sizeof(g));
        memset(d,0,sizeof(d));
        n=0;
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            g[a][b]++;
            g[b][a]++;
            d[a]++;
            d[b]++;
            n=MAX(n,MAX(a,b));
        }
        for(start=1;d[start]==0 && start<=n;start++);
        for(i=start;(d[i]&1)==0 && i<=n;i++);
        if(i<=n)    start=i;
        top=0;
        dfs(start);
        for(i=top-1;i>=0;i--)   printf("%d\n",path[i]);
    }
    return 0;
}
/**********************************************************************
	Problem: 1184
	User: 3901140225
	Language: C++
	Result: AC
	Time:4 ms
	Memory:2104 kb
**********************************************************************/

相關推薦

CSU 1182: 表示式 1183: 計算表示式 1184: 地雷

#include <stdio.h> #include <string.h> #define INI 0 #define NUM 1 #define OPT 2 #define

c語言作業,,輸入表示式計算表示式

題目概述:表示式只含+,-運算子,運算元為整數,以封號結尾,例:233-67+89;#include <stdio.h> #include <stdlib.h> #include <str

如何用C語言計算表示式,棧的經典應用

宣告:這個程式可以計算+,-,*,/,負數,小數 負數用括號括起來例如(-1) 負數的計算過程:(-1)  轉變為 (0-1)  哈哈~   分成六個點: 1.我的檔案結構 2.順序堆疊的標頭檔案 3.標頭

[原始碼和報告分享]基於C++的表示式計算

功能要求 為了實現表示式求值,本專案要求首先讀入表示式(包括括號)並建立對應二叉樹,其次對二叉樹進行前序遍歷,中序遍歷,後序遍歷,輸出對應的波蘭表示式,中綴表示式和逆波蘭表示式。     詳細的開發文件和程式原始碼我都分享在了個人部落格上了,感興趣的可以去看看: https:

[原始碼和文件分享]基於C++的表示式計算

一、使用說明 1.1 專案簡介 表示式求值是程式設計語言編譯中的一個最基本的問題,就是將一個表示式轉化為逆波蘭表示式並求值。具體要求是以字元序列的形式從終端輸入語法正確的、不含變數的整數表示式,並利用給定的優先關係實現對算術四則混合表示式的求值,並演示在求值過程中運算子棧,運算元棧,輸入字元

計算表示式

題目描述 小明在你的幫助下,破密了Ferrari設的密碼門,正要往前走,突然又出現了一個密碼門,門上有一個算術表示式,其中只有如下符號: “(”,“)”,“0~9”,“+”,“-”,“*”,“/”,“^” 其中“^”表示乘方,“/”用整除。 輸入的表示式都是合法的,這

利用棧實現計算表示式字串的(C語言)

利用字尾表示式的思想,輸入一個字串,計算其值。 計算方案 #include "LinkStack.h" int priority(char ch) { switch(ch) { case '(': return 3; case '*': case

從鍵盤輸入一個表示式,試編寫演算法計算表示式

hanshu.h://運算子棧 #include <iostream> #include <string> using namespace std; #include "Status.h" typedef struct {char *base;char *top;int stacksi

Java集合框架練習-計算表示式

最近在看《演算法》這本書,正好看到一個計算表示式的問題,於是就打算寫一下,也正好熟悉一下Java集合框架的使用,大致測試了一下,沒啥問題。 import java.util.*; /* * * 用來計算表示式 * for example: 1+2*3*(4+3*1)

利用棧計算表示式

#include <stdio.h> #include <stdlib.h> #define MaxSize 100 //符號棧 struct opstack { char data[MaxSize];//儲存操作符 int top;//指向棧頂的

給定一個字串表示式s,計算(使用string和stack實現)

<span style="font-size:18px;">toPosfix函式將中綴表示式轉換為字尾表示式,calculatePosfix函式計算字尾表示式的值。 #include <iostream> #include <stack&g

計算表示式c++逆波蘭式實現方法

#include<stack>//棧容器的標頭檔案 #include<iostream> #include<math.h> //數學 標頭檔案 次方函式 using namespace std; int Precedence(char

棧之計算表示式

演算法思想: 規定運算子的優先順序表 設定兩個棧,運算數棧,運算子棧。 輸入一個表示式,自左向右掃描,進行如下處理:若遇到運算數則進棧,若遇到運算子,則與運算子棧中的棧頂元素進行優先順序比較。1.如果當前運算子優先順序大於棧頂元素的優先順序,則當前運算子進棧

計算表示式(棧)

#題目描述#小明希望破破一個密碼門。門上有一個算式,其中只有“(”、“)”、“0-9”、“+”、“-”、“*”、“/”、“^”,求出的值就是密碼。小明的數學學得不好,還需你幫他的忙。(“/”用整數除法)#輸入格式#一個只有一行的算式(算式長度<=30)。#輸出格式#輸出

java計算表示式

package sweexamination.level1; import java.util.ArrayList; import java.util.List; import java.util.Stack;  /**  *  轉為字尾表示式:  *  運算元直接放入

練習 1-6 驗證表示式getchar()!=EOF的是0還是1。

C語言程式設計(第二版) 練習1-6 個人設計 練習 1-6 驗證表示式getchar()!=EOF的值是0還是1。 程式碼塊: #include <stdio.h> #include <stdlib.h> int main() { printf("

C#計算表示式(仿計算器功能)

一、用MSScriptControl在C#中執行JavaScript程式碼javascript中有個eval方法用過的人都知道他的方便和強大之處。 在C#中,我們也可以通過Com元件來執行一段javascript程式碼。 下面的程式碼展示瞭如何用MSScriptControl 元件執行一段數學表示式

C語言程式設計-1199-計算表示式

Problem Description 計算下列表達式值: Input 輸入x和n的值,其中x為非負實數,n為正整數。 Output 輸出f(x,n),保留2位小數。 Sample Input 3 2 Sample Output 2.00 看到題目是一臉懵逼的,看了下別人的程式碼,原文

棧的使用------Java實現中綴表示式轉為字尾表示式計算

轉換思路: 1、中綴表示式轉為字元陣列按順序遍歷 2、讀到運算元的時,新增到要輸出字串 3、讀到操作符是“(”,則直接把“(”壓入棧中。 4、讀到操作符“)”,則從棧中彈出棧元素並新增到要輸出的字串,直到遇到第一個“(”為止 5、讀到操作符“+”,“-”,若棧不為空且棧頂元素

el表示式獲取物件屬性 返回型別

實現 數字頁碼時 遇到的一個問題。 後端servlet 在request.setAttribute("page",page); page 為pagebean的例項物件,pagebean類中有int 格式屬性 pageNum; 前端 js 中 el表示式獲取到的pageNum 預設為 String 型別。導