スタックの問題: 5つの数字を逆さにする方法

このQ&Aのポイント
  • スタックを用いて5つの数字を逆さにする方法について説明します。
  • スタックの操作のみを使用し、2つの追加のスタックを用いて要素の順序を反転する方法について説明します。
  • 具体的なアルゴリズムとコード例を提供します。
回答を見る
  • ベストアンサー

これで最後、スタックの問題です…

これでやっと最後です。 一つのスタックに積んである5つの数字を二つのスタックを用いて逆さにする問題です。 Suppose that you have a stack "S". Using the usual stack operations (given in figure 4.7 on page 138), -explain how you can reverse the order of elements on stack "S" using only two additional stacks. -write a void method called "reverse" the order of elements on stack "s". The method creates two new stacks and will use only the stack operations given in figure 4.7. Figure 4.7(これらの命令しか使ってはいけません) boolean empty() Object peek() Object pop() Object push(el) int search(el) Stack() public void reverse (Stack s) { Stack s1, s2; s1 = new Stack(); s2 = new Stack(); //ブランク 25 5 30 20 10 - S ←スタック(実行前) 10 20 30 5 25 - S ←スタック(実行後) 私自作のメソッド public void reverse (Stack s) { Stack s1, s2; s1 = new Stack(); s2 = new Stack(); while(!S.empty()) { S1.push(S.pop()); } while(!S1.empty()) { s2.push(S1.pop()); } while(!S2.empty()) { S.push(S2.pop()); } } アルゴリズムは分かっている(つもりな)んですが 本当にこれで動くのか分かりません。 mainも含めたプログラムは教科書に載っていません。 pushとpopの図はたくさんあるのですが、肝心のプログラムが載っていません。 上のであっていますでしょうか? スタックの神様、どうかお助け下さい。m(__)m

  • ginkgo
  • お礼率94% (132/139)

質問者が選んだベストアンサー

  • ベストアンサー
  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.1

本当に動くか?、あってるか? といわれても、言語仕様も環境もわからない状態では、 「あっている気がする」としか返答できないでしょう。 mainを書けば動作確認できるのなら、 mainで ・Stack Sを用意 ・Sに初期値を設定 ・reverseを実行 ・Sの中身を表示 すれば、確認できるかと思いますが。 実際に動作させるのが困難な場合は、コインなどを 使って、手で確認するのが良いです。

ginkgo
質問者

お礼

あっていたようです。 ありがとうございました。

関連するQ&A

  • クラス→スタックを使う

    初歩的なとこですがすでに着いていけず困っています。 問題は、  下記のプログラムにおいて、スタックへ整数10を入れるには、push(10)としてメソッドpushを呼び出す。逆に、スタックから値を取り出すには、pop()メソッドを呼び出す。また、現在のスタックの先頭位置(スタックポインタsp)は、メソッドgetSP()を呼び出すことで得られる。今、整数10と20をこの順にスタックへ入れた後、スタックから先頭の要素(整数)を取り出す。ただし、取り出した値は出力する必要はない。そして、これらの操作(3回ある)が終わる毎に、その時のスタックポインタspの値を出力する。  このような動作をするようにmainメソッドを完成させ、実行結果を確かめなさい。 class Stack { int [] stack = new int[10]; int sp = 0; void push(int n){ if(sp < stack.length){ stack[sp] = n; sp++; } } void pop(){ if(sp > 0)sp--; } int getSp(){ return sp; } public static void main(String[] args){ // <この部分を完成させなさい> } } 宜しくお願いします!!  

    • ベストアンサー
    • Java
  • スタックのデータ構造を作りたい

    C言語でスタックと、スタックにデータを入れるプッシュ、取り出すポップを作りたいと思っており そこで以下のようなものを作ってみました。 ********************************************** #include<stdio.h> typedef struct{ int a[100]; int head=0; }Stack; void push(Stack stc,int x){ stc.a[head]=x; stc.head++; } int pop(Stack stc){ return(stc.a[head-1]); stc.head--; } int main void{ int j; Stack s; push(s,5); push(s,90); j=pop(s); printf("%d",j); j=pop(s); printf("%d",j); return 0; } ****************************** コンパイルするとエラーが出まくりです。 何をどう直せばよいのか、どこが変なのかご教授いただきたいです。 よろしくお願いいたします。

  • スタックの配列プログラム

    スタックを配列で実現するプログラムとして #include<stdio.h> #define stack_size 100 #define stack_el_type int stack_el_type stack[stack_size]; int sp; void init_stack() { sp=-1 } void push(stack_el_type x) { if (sp < stack_size -1) stack[++sp] = x; else{ printf("stack full error.\n"); exit(1); } } stack_el_type pop() { if(sp >= 0 ) return stack[sp--]; else { printf("stack empty error.\n") exit(1); } } 上の完成形を参照として、 他の作り方として int stack[100] int sp void push(int x) int pop() を用いて作成する場合どのようにすればよいのでしょうか? またスタックを一方向リストで実現するプログラムを作成するとき struct node{ int data; struct node *next; } struct node *push(int x,struct node *root) struct node *pop(struct node *root) を用いて作成する場合どのようにすればよいのでしょうか? よろしければご教授お願いします

  • スタックについて

    スタックを実現するプログラムを作っているのですが、実行するとセグメテーション違反が表示されます。でもどこが間違っているのかわかりません!どうしたらいいのでしょう? #include<stdio.h> #include<stdlib.h> struct stack{ int max; int used; int *array; }; struct stack * stack_create(int n) { struct stack *s; int i; s->array=(int *)malloc(sizeof(int)*n); s->used=0; s->max=n; return 0; } void stack_free(struct stack *s) { free(s); } int stack_push(struct stack *s,int datum) { if(s->used>=s->max){ return 0; } s->array[s->used]=datum; s->used++; return 1; } int stack_pop(struct stack *s,int *datump) { if(s->used<=0){ return 0; } *datump=s->array[s->used-1]; s->used--; return 1; } int stack_is_empty(const struct stack *s) { return s->used==0; } int main() { struct stack s; int i,p; int n; scanf("%d",&n); stack_create(n); for(i=0;i<=5;i++){ stack_push(&s,i); printf("push%2d\n",i); } for(i=1;i<=3;i++){ stack_pop(&s,&p); printf("pop%2d\n",p); } }

  • スタックのプログラムを作成しているのですが、うまく出来ません。

    プログラムの内容を簡単に言うと、配列s[100]と変数topを用いて、ファイルdata.datからgetc()を用いて文字を1文字ずつ読み込み、スタック(s[100])にpush-downするプログラムです。 細かく言うと、作成したプログラムによりファイルからキー(文字)を読み込みスタックにpush-downし、スタックの内容を表示した後に、キーボードからキー(文字)を1文字ずつ入力して、スタックを操作する。 ・スタック操作の仕様はキーボードからキー(文字)を1文字ずつ入力する際に、0を入力した場合、プログラム終了。1を入力した場合、1文字pop-upした後、pop-upした文字とスタックの内容を表示。その他の文字を入力した場合、その文字をpush-downした後、スタックの内容を表示。(スタックの内容の表示はprint_stack_mtrx(s,top)を使用する。) ・push-downとpop-upはそれぞれ1つの関数で定義する。 といった感じのプログラムを作成しているのですが、関数push,popの部分をどう書いたら良いのか良く分かりません。一応自分で書いてみたのですが、うまくいきませんでした。どなたか教えていただけないでしょうか? *ファイルdata.datからはリダイレクションを用いて読み込む。 <作成途中のソースプログラム> #include<stdio.h> #include<stdlib.h> #define MAX 100 char s[MAX]; int top; void init_stack(){ ______top = 0; _______return; } void print_stack_mtrx(char* s, int top){ __int i; ____if(top == 0){ ______printf("Stack is empty.\n"); ____} ____else{ ______printf("--- Contents of Stack ---\n"); ______for(i = 0; i < top; i++){ ________if(!i){ __________printf("%2c < -- Top (%2d)\n", s[top - i - 1], top); ________} ________else{ __________printf("%2c \n", s[top - i - 1]); ________} ______} ______printf("-------------------------\n"); ____} } char push(char* s, int top, char j){ ___s[top]=j; ___top++; } char pop(char* s, int top){ _char c; ___c = s[top]; ___top--; ___return c; } int main(void) { _int c; _char j; _char i; init_stack(); _______while(((c=getc(stdin))!=EOF) && top<MAX){ _______/* ファイルdata.dat からgetc()を用いて1文字ずつ読み込みスタックsに格納.ただしスタックの出入り口を示す top の値も監視すること*/ _________s[top] = c; _________top++; _______} _______print_stack_mtrx( s, top );/* スタック(配列)の内容を表示する関数*/ _______while(1){ _________scanf("%c\n", &j); _________if(j=='0'){ ___________break; _________} _________else if(j=='1'){ ___/* 1文字pop-upした後, pop-upした文字とスタックの内容を表示 */ ___________i = pop(s, top); ___________printf("pop-upした文字: %c\n", i); ___________print_stack_mtrx( s, top ); _________} _________else{ ___/* その他の文字を入力した場合, その文字をpush-downした後,スタックの内容を表示 */ ___________push(s, top, j); ___________print_stack_mtrx( s, top ); _________} _______} _______return 0; }

  • ArrayList でスタックを

    初歩的でツマラナイかもしれません。 import java.util.ArrayList; でスタックを実現するクラス"MyStack"を書きました。 フィールドは private ArrayList<Integer> stack = new ArrayList<Integer>(); のみという条件です。 MyStack.java - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - import java.util.ArrayList; public class MyStack {   private ArrayList<Integer> stack = new ArrayList<Integer>();      // データを先頭に追加   public void push( int item ) {     stack.add( item );   }   // 先頭のデータを取り出す   public int pop( ) {     int rtn;     if( stack.isEmpty() ) {       System.out.println( "スタックは空です." );       System.exit( 1 );     }          rtn = stack.get( 0 );     stack.remove( 0 );     return rtn;   } } このMyStackを実行するクラス"MainForMyStack"を書きます。 実行結果は、標準出力に 43210 と出ることを想定しています。 MainForMyStack.java - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - import java.util.ArrayList; public class MainForMyStack {   public static void main(String[] args) {     MyStack stack = new MyStack();     // 0,1,2,3,4 をスタックに追加     for( int i=0; i < 5; i++ ) {       stack.push( i );     }     // スタックのデータを先頭から取り出す     for( int i=0; i < stack.size(); i++ ) {       System.out.print( stack.pop() );     }   } } さて、MainForMyStack.java の i < stack.size(); の箇所でエラーが出るのはなぜでしょう? どなたかご教授の方お願いします。

    • ベストアンサー
    • Java
  • C# スタックに格納する要素が配列について

    スタックに格納する要素が配列の場合 // スタック生成 Stack<int[]> StackObj = new Stack<int[]>(); // 格納する配列データーの作成 int[] ArrayWork = new int[2]; ArrayWork[0] = 7; ArrayWork[1] = 12; // スタックに格納 StackObj.Push(ArrayWork); のように記述できます 同様に、POP、PEEP、COUNTの場合、どのように記述すればいいでしょうか?

  • c言語 スタックの標準入力の課題です

    c言語のスタックについての質問です。 実装したのですが、標準入力の部分を i 9 o i 8 i 7 o i 6 i 5 o i 4 o o i 3 i 2 i 1 o o e といったように指示を一括してやるために直す方法を教えていただきたいです。 iはプッシュ oはポップ eは終了 sは入力時点でのスタックに格納された全体の内容表示 となってます。 #include<stdio.h> #define MaxSize 100 //スタックサイズ int stack[MaxSize];//スタック int sp;//スタックポインタ int push(int); int pop(int *); void show_stack(); void main(void) { int c,n; while(printf("]"),(c=getchar())!=EOF){ rewind(stdin); if(c=='i'||c=='I'){ printf("data--> "); scanf("%d", &n); rewind(stdin); if(push(n)==-1){ printf("スタックがいっぱいです\n"); } } if(c=='o'||c=='O'){ if(pop(&n)==-1) printf("スタックは空です\n"); else printf("stack data-->%d\n",n); if(c=='e'||c=='E') break; } if(c=='s'||c=='S') show_stack(); } } int push(int n)//スタックにデータをつむプッシュ { if(sp<MaxSize){ ++sp; stack[sp]=n; return 0; } else return -1; } int pop(int *n) { if(sp>0){ *n=stack[sp]; sp--; return 0; } else return -1; } void show_stack() { int i; puts("スタックの内容"); if(sp<0){ printf("スタックは空です。\n"); } else for(i=sp;i>=1;i--) { printf("%11d\n",stack[i]); printf("\n"); } }

  • C言語で変更していただきたい所があるのですが・・・

    下のソースを加減乗除だけでなく、余りを求める演算(%)やべき乗演算(^)も使えるようにしたいのですがうまくいきません。 どなたか変更例をお見せできますでしょうか? #include <stdio.h> #include <stdlib.h> #define STACK_MAX 10 /* 配列によるスタック構造 */ double stack[STACK_MAX]; /* スタック頂上の位置(最下部からのオフセット)*/ int stack_top = 0; /* スタックへのpush */ void stack_push(double val) { if(stack_top == STACK_MAX) { /* スタックが満杯になっている */ printf("エラー:スタックが満杯です(Stack overflow)\n"); exit(EXIT_FAILURE); } else { /* 渡された値をスタックに積む */ stack[stack_top] = val; stack_top++; } } /* スタックからpop */ double stack_pop(void) { if(stack_top == 0) { /* スタックには何もない */ printf("エラー:スタックが空なのにpopが呼ばれました" "(Stack underflow)\n"); exit(EXIT_FAILURE); return 0; } else { /* いちばん上の値を返す */ stack_top--; return stack[stack_top]; } } int main(void) { char buffer[256]; double cal1, cal2; int i; do { printf("現在のスタック(%d個):", stack_top); for(i = 0; i < stack_top; i++) { printf("%0.3f ", stack[i]); } printf("\n>"); fgets(buffer, 255, stdin); switch(buffer[0]) { case '+': cal1 = stack_pop(); cal2 = stack_pop(); stack_push(cal2 + cal1); break; case '-': cal1 = stack_pop(); cal2 = stack_pop(); stack_push(cal2 - cal1); break; case '*': cal1 = stack_pop(); cal2 = stack_pop(); stack_push(cal2 * cal1); break; case '/': cal1 = stack_pop(); cal2 = stack_pop(); stack_push(cal2 / cal1); break; case '=': /* =の場合はこのすぐあとでwhile文からも抜ける */ break; default: /* 入力された値は数字のはずなので,スタックに積む */ stack_push(atoi(buffer)); break; } } while(buffer[0] != '='); printf("計算結果は%f です。\n",stack_pop()); if(stack_top != 0) { printf("エラー:スタックにまだ数が残っています\n"); return EXIT_FAILURE; } return EXIT_SUCCESS; }

  • スタックで成績表を作るプログラム。

    成績表を作りたい。Studentのクラスを要素とするクラスStackを完成させてプログラムが動作するようにせよという問題なのですがprivateの物をどうやって要素にすればよいのでしょうか? class Student { private int id; private String name; private int eng; private int math; private int kokugo; Student(int i,String nm,int e,int m,int k) { id=i;name=nm;eng=e;math=m;kokugo=k; } void show(){ System.out.println("("+id+","+name+","+ eng+","+ math+","+ kokugo+")"); } } class Stack { } class Sample { public static void main(String[] args) { Stack ss=new Stack(3); ss.push(new Student(1,"A",10,10,10)); ss.push(new Student(2,"B",20,10,10)); ss.push(new Student(3,"C",30,10,10)); ss.push(new Student(4,"D",40,10,10)); ss.pop(); ss.pop(); ss.pop(); ss.pop(); } }

    • ベストアンサー
    • Java