C言語関係掲示板

過去ログ

No.1186 スタック

[戻る] [ホームページ]
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言語について勉強します。
ありがとうございました。