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 型別。導