No.15510![]() |
スタック 投稿者---0崎(2004/07/14 16:34:08) |
||
>push "X" // 値は”で区切る Depth=1; stack={X} >push "12" Depth=2; stack={12,X} >pop "12" Depth=1; stack={X} というように、動作させたいのです。 このソースでは英一文字でswitchさせています。ここをpopやpush といったコマンドで実現させたいのですが分かりません。 どなたか教えてください。 /**********************/ /* コマンド表 */ /* p : データ追加 */ /* g : データ取り出し */ /* c : 初期化 */ /* o : 件数表示 */ /* q : 終了 */ /**********************/ #include <stdio.h> int push(int [], int, int, int); int pop(int [], int, int *); int output(int [], int); int clear(int); int main(void) { int stack[5]; char cmd[2]; int indt; int index; int ret; index=0; cmd[0] = ' '; while(cmd[0]!='q'){ printf("Command?\n>"); scanf("%s", cmd); switch(cmd[0]) { case 'p': printf("Push >> "); scanf("%d", &indt); ret=push(stack,indt,index,5); if(ret==-1){ printf("full\n"); }else { index = ret; } break; case 'g': ret=pop(stack,index,&indt); if(ret==-1){ printf("empty\n"); }else{ printf("OutPut \"%d\"\n", indt); index=ret; } break; case 'c': index=0; ret=0; break; case 'o': if(ret==0){ printf("empty\n"); } } printf("Deapth= %d; ", ret); printf("Stack= {"); ret = output(stack,index); printf("}"); printf("\n"); } } int push(int dis[], int dt, int idx, int max) { if (idx >= max) { return -1; }else{ dis[idx]=dt; return (idx+1); } } int pop(int dis[], int idx, int *pdt) { if(idx <= 0) { return -1; }else{ *pdt = dis[idx-1]; return (idx-1); } } int output(int dis[], int idx) { int i; if(idx>0){ for (i=idx-1;i>=0;i--){ printf("%d, ", dis[i]); } } return idx; } |
No.15515![]() |
Re:スタック 投稿者---REE(2004/07/14 18:32:46) |
||
>このソースでは英一文字でswitchさせています。ここをpopやpush >といったコマンドで実現させたいのですが分かりません。 どの部分が分からないのですか? |
No.15524![]() |
Re:スタック 投稿者---0崎(2004/07/14 21:31:55) |
||
ここまでやったのですが、PushDownとPopUpの部分が分かりません。 教えてください。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> char* Command1[2] = { "PopUp" }; char* Command2[2] = { "Clear" }; char* Command3[2] = { "End" }; char* Command4[2] = { "PushDown" }; int push(int [], int , int, int); int pop(int [], int, int *); int output(int [], int); int main(void) { char str[256]; char *cd[16]; int stack[5]; char cmd[2]; int indt; int index; int ret; int i; index=0; cmd[0] = ' '; while( printf(">"), fgets(str,256,stdin) ) { //'\n'切捨て i = strlen(str); if(str[i-1] == '\n') str[i-1] = '\0'; //切り出し cd[0] = strtok(str," \""); for(i = 1;i < 16;i++){ cd[i] = strtok( NULL," \"" ); if ( cd[i] == NULL ) break; } if (strcmp(Command4[0], cd[0]) == 0) { scanf("%d", &indt); ret=push(stack,indt,index,5); if(ret==-1){ printf("full\n"); }else { index = ret; } break; }else if ( strcmp(Command1[0], cd[0]) == 0) { ret=pop(stack,index,&indt); if(ret==-1){ printf("empty\n"); }else{ printf("OutPut \"%d\"\n", indt); index=ret; } break; }else if (strcmp(Command2[0], cd[0]) == 0) { index=0; ret=0; break; }else if (strcmp(Command3[0], cd[0]) == 0) { exit(0); } printf("Deapth= %d; ", ret); printf("Stack= {"); ret = output(stack,index); printf("}"); printf("\n"); } } int push(int dis[], int dt, int idx, int max) { if (idx >= max) { return -1; }else{ dis[idx]=dt; return (idx+1); } } int pop(int dis[], int idx, int *pdt) { if(idx <= 0) { return -1; }else{ *pdt = dis[idx-1]; return (idx-1); } } int output(int dis[], int idx) { int i; if(idx>0){ for (i=idx-1;i>=0;i--){ printf("%d, ", dis[i]); } } return idx; } |
No.15530![]() |
Re:スタック 投稿者---あかま(2004/07/14 23:22:24) |
||
かなり適当ですが。 #include <stdio.h> #include <string.h> char stk[128][128]; int stcnt; int push(char *str){ if(stcnt < 128){ strcpy(stk[stcnt],str); stcnt++; } else{ printf("stack overflow"); return 0; } return 1; } int pop(){ if(stcnt > 0){ stcnt--; printf("%s\n",stk[stcnt]); } else{ printf("no stack\n"); return 0; } return 1; } int main(){ char str[256]; char com[128],pr[128]; int i; while(1){ printf(">"); fgets(str,256,stdin); i = sscanf(str,"%s \"%[^\"]",com,pr); if(i == 2 && strcmp(com,"push")==0){ push(pr); } else if(strcmp(com,"pop")==0){ pop(); } else if(strcmp(com,"end")==0){ break; } else{ printf("unknown command\n"); } } return 0; } 実行結果 >push "ak" >push "abc ef" >pop abc ef >pop ak |
No.15539![]() |
Re:スタック 投稿者---REE(2004/07/15 10:13:22) |
||
>ここまでやったのですが、PushDownとPopUpの部分が分かりません。 >教えてください。 if (strcmp(Command4[0], cd[0]) == 0) { scanf("%d", &indt); ret=push(stack,indt,index,5); ここで、scanfを使っていますが、既に値は、cd[1]に取り込んであるはずなので、変わりに以下の様にします。 sscanf(cd[1], "%d", &indt); |
No.15558![]() |
Re:スタック 投稿者---0崎(2004/07/15 21:18:55) |
||
PushDownの部分でcd[1]に取り込んだ値を渡すところまではいけてると思う のですが、出力の部分がうまくいってません。教えてください。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> char* Command1[2] = { "PopUp" }; char* Command2[2] = { "Clear" }; char* Command3[2] = { "End" }; char* Command4[2] = { "PushDown" }; int push(char [], char , int, int); int pop(char [], int, char *); int output(char [], int); int main(void) { char str[256]; char *cd[16]; char stack[5]; char cmd[2]; char indt; int index; int ret; int i; index=0; cmd[0] = ' '; while( printf(">"), fgets(str,256,stdin) ) { //'\n'切捨て i = strlen(str); if(str[i-1] == '\n') str[i-1] = '\0'; //切り出し cd[0] = strtok(str," \""); for(i = 1;i < 16;i++){ cd[i] = strtok( NULL," \"" ); if ( cd[i] == NULL ) break; } if (strcmp(Command4[0], cd[0]) == 0) { sscanf(cd[1],"%s", &indt); ret=push(stack,indt,index,5); if(ret==-1){ printf("full\n"); }else { index = ret; } break; }else if ( strcmp(Command1[0], cd[0]) == 0) { ret=pop(stack,index,&indt); if(ret==-1){ printf("empty\n"); }else{ printf("OutPut \"%d\"\n", indt); index=ret; } break; }else if (strcmp(Command2[0], cd[0]) == 0) { index=0; ret=0; break; }else if (strcmp(Command3[0], cd[0]) == 0) { exit(0); } printf("Deapth= %d; ", ret); printf("Stack= {"); ret = output(stack,index); printf("}"); printf("\n"); } } int push(char dis[], char dt, int idx, int max) { if (idx >= max) { return -1; }else{ dis[idx]=dt; return (idx+1); } } int pop(char dis[], int idx, char *pdt) { if(idx <= 0) { return -1; }else{ *pdt = dis[idx-1]; return (idx-1); } } int output(char dis[], int idx) { int i; if(idx>0){ for (i=idx-1;i>=0;i--){ printf("%s, ", dis[i]); } } return idx; } SampleSource */ #include <stdio.h> int main( void ) { int a[10] = {1, 2, 3}, i; // Comment int *p = a; /* Pointer */ for (i = 0; i < 10; i++) { printf( "%p : %d\n", &p[i], p[i] ); } return 0; } |
No.15571![]() |
Re:スタック 投稿者---REE(2004/07/16 10:31:26) |
||
>PushDownの部分でcd[1]に取り込んだ値を渡すところまではいけてると思う >のですが、出力の部分がうまくいってません。教えてください。 うまくいかないときには、どううまくいかないのか説明してください。 ちなみにスタックに保持するものが、数値だったものを任意の1文字に変えたということでよろしいですか? もし1文字でよければ、scanfやprintfでは%sではなく%cを使います。 |
No.15595![]() |
Re:スタック 投稿者---0崎(2004/07/16 21:21:15) |
||
>うまくいかないときには、どううまくいかないのか説明してください。 すみません、説明不足でした。 うまくいかないというのは、関数pushに値を渡すときのところか、その 前後のところです。どうも、そこから値を判定してmainの終端括弧 にとんでしまうのです。 >もし1文字でよければ、scanfやprintfでは%sではなく%cを使います。 一文字だけでなく文字列として扱いたいのです。 |
No.15587![]() |
Re:スタック 投稿者---ニタチ(2004/07/16 12:42:50) |
||
>push "X" // 値は”で区切る Depth=1; stack={X} >push "12" Depth=2; stack={12,X} >pop "12" Depth=1; stack={X} %cを使うにしろ、これでは一文字ずつしか格納できませんので、 "X"に対応できても、"12"には対応できません。 あかまさんがソースを提示していますが、この場合はchar[][]を使い、 文字列としてスタックに格納しておくといいと思います。 |
No.15594![]() |
Re:スタック 投稿者---0崎(2004/07/16 21:02:20) |
||
>この場合はchar[][]を使い、 >文字列としてスタックに格納しておくといいと思います。 提示したプログラムを二次元配列にすればいいのでしょうか? |
No.15544![]() |
Re:スタック 投稿者---ニタチ(2004/07/15 11:19:44) |
||
>push "X" // 値は”で区切る Depth=1; stack={X} >push "12" Depth=2; stack={12,X} >pop "12" Depth=1; stack={X} というように、動作させたいと書いていますが、 stackがint型の配列では、pushの時に"X"を入力すると対応できませんよ? |
No.15610![]() |
Re:スタック 投稿者---0崎(2004/07/17 12:52:19) |
||
いろいろと試したのですが、出力されません。 output関数の部分か、値をpush関数にわたすところが違うと思う のですが、行き詰まりました。どなたかアドバイスをお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 128 int push(char [], char , int, int); int pop(char [], int, char *); int output(char [], int); int main() { char str[MAX]; char *cd[MAX]; char stack[MAX]; char indt; int index=0, ret, i; while( printf(">"), fgets(str,256,stdin) ) { /* '\n'切捨て */ i = strlen(str); if(str[i-1] == '\n') str[i-1] = '\0'; /* 切り出し */ cd[0] = strtok(str," \""); for(i = 1;i < 16;i++){ cd[i] = strtok( NULL," \"" ); if ( cd[i] == NULL ) break; } if (strcmp(cd[0], "PushDown") == 0) { sscanf(cd[1],"%s", &indt); ret=push(stack,indt,index,5); if(ret==-1){ printf("stack full\n"); }else { index = ret; } break; }else if (strcmp(cd[0], "PopUp") == 0) { ret=pop(stack,index,&indt); if(ret==-1){ printf("stack empty\n"); }else{ printf("OutPut \"%s\"\n", indt); index=ret; } break; }else if (strcmp(cd[0], "Clear") == 0) { index=0; ret=0; break; }else if (strcmp(cd[0], "End") == 0) { exit(0); }else{ printf("ERROR\n"); } } printf("Deapth= %d; ", ret); printf("Stack= {"); ret = output(stack,index); printf("}\n"); } int push(char dis[], char dt, int idx, int max) { if (idx >= max) { return -1; }else{ dis[idx]=dt; return (idx+1); } } int pop(char dis[], int idx, char *pdt) { if(idx <= 0) { return -1; }else{ *pdt = dis[idx-1]; return (idx-1); } } int output(char dis[], int idx) { int i; if(idx>0){ for (i=idx-1;i>=0;i--){ printf("%s, ", dis[i]); } } return idx; } |
No.15614![]() |
Re:スタック 投稿者---あかま(2004/07/17 13:50:58) |
||
2次元配列にしないと。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 128 #define STK_MAX 5 int push(char [][MAX], char[] , int, int); int pop(char [][MAX], int, char *); int output(char [][MAX], int); int main() { char str[MAX]; char *cd[MAX]; char stack[STK_MAX][MAX]; char indt[MAX]; int index=0, ret, i; while( printf(">"), fgets(str,256,stdin) ) { /* '\n'切捨て */ i = strlen(str); if(str[i-1] == '\n') str[i-1] = '\0'; /* 切り出し */ cd[0] = strtok(str," \""); for(i = 1;i < 16;i++){ cd[i] = strtok( NULL," \"" ); if ( cd[i] == NULL ) break; } if (strcmp(cd[0], "PushDown") == 0) { ret=push(stack,cd[1],index,STK_MAX); if(ret==-1){ printf("stack full\n"); }else { index = ret; } }else if (strcmp(cd[0], "PopUp") == 0) { ret=pop(stack,index,indt); if(ret==-1){ printf("stack empty\n"); }else{ printf("OutPut \"%s\"\n", indt); index=ret; } }else if (strcmp(cd[0], "Clear") == 0) { index=0; ret=0; }else if (strcmp(cd[0], "End") == 0) { break; }else{ printf("ERROR\n"); } } printf("Stack= {"); ret = output(stack,index); printf("}\n"); printf("Deapth= %d; ", ret); return 0; } int push(char dis[][MAX], char dt[], int idx, int max) { if (idx >= max) { return -1; }else{ strcpy(dis[idx],dt); return (idx+1); } } int pop(char dis[][MAX], int idx, char *pdt) { if(idx <= 0) { return -1; }else{ strcpy(pdt,dis[idx-1]); return (idx-1); } } int output(char dis[][MAX], int idx) { int i; if(idx>0){ for (i=idx-1;i>=0;i--){ printf("%s, ", dis[i]); } } return idx; } |
No.15695![]() |
Re:スタック 投稿者---0崎(2004/07/20 16:15:34) |
||
そうでした、私もこのソースに似たような形になりました。 もっと、たくさんc言語について勉強します。 ありがとうございました。 |