0

ユーザーが入力するすべての文字にポインターを割り当てたい。そうすることで、おそらくループを使用して文字を格納し、2 番目のループでポインターを使用してスタックの順序を再配置できます。しかし、それをプログラム形式で書く方法がわかりませんし、それが機能するかどうかもわかりません。これが私がこれまでに持っているものです:

#include<iostream>

using namespace std;

class Stack{
public:
  enum {MaxStack = 50};
  void init() {top = -1;}
  void push( char n ){
    if ( isFull() ) {
      cerr << "Full Stack. DON'T PUSH\n";
      return;
    }
    else {
      arr[ ++top ] = n;
      cout << "Just pushed " << n << endl;
      return;}
  }
  int pop() {
    if (isEmpty() ) {
      cerr << "\tEmpty Stack. Don't Pop\n\n";
      return 1;
    }
    else 
      return arr[top--];
  }
  bool isEmpty() {return top < 0 ? 1 : 0;}
  bool isFull() {return top >= MaxStack -1 ? top : 0;}
  void dump_stack() {
    cout << "The Stack contents, from top to bottom, from a stack dump are: " << endl;
    for (int i = top; i >= 0; i--)
      cout << "\t\t" << arr[i] << endl;
  }
private:  
  int top;
  int arr[MaxStack];
};

int main()
{   

    Stack a_stack;
    int x = 0;
    char inputchar;


    cout<<"Please enter a word"<<endl;
  a_stack.init();

while (inputchar != '.') //terminating char
 {
 cin >> inputchar;
 array[x] = inputchar;
 x++;
 }

int j = x;

for (int i = 0; i < j; i++)
 {
 cout << array[x];
 x--;
 }
  a_stack.push();

  a_stack.dump_stack();

return 0;
}  
4

2 に答える 2

1

スタックは、まさに LIFO の性質 (後入れ先出し) により、入れたものの順序を逆にします。文字列「こんにちは」の例:

(スタックの一番上は左側にあります)

H        push "H"
eH       push "e"
leH      push "l"
lleH     push "l"
olleH    push "o"

スタックからポップすると、最初に「o」、次に「l」などになります。入力したものは何でも逆順になります。それを達成するために特別なことをする必要はありません。通常の順序でスタックにプッシュするだけで、ポップすると逆になります。

// while loop
{
    cin >> inputchar;
    a_stack.push(inputchar);
}

// Display in reverse
while (not a_stack.isEmpty()) {
    cout << (char)a_stack.pop();
}

を使用した小さなプログラム例を次に示しstd::stackます
(ここでは入力エラーのチェックは行われません)。

#include <iostream>
#include <stack>

int main()
{
    std::stack<char> st;
    char c = '\0';
    while (c != '.') {
        c = std::cin.get();
        st.push(c);
    }

    while (not st.empty()) {
        std::cout << st.top();
        st.pop();
    }
    std::cout << '\n';
}

入力と出力の例:

こんにちは世界。
.dlrow olleH
于 2012-11-12T20:03:38.837 に答える
0

スタックの使用が必須 (つまり、宿題) でない限りgetline()、そのパラメーターdelim( getlineを参照) に続いて配列の逆ループを使用する方がよい場合があります。より速く、よりクリーンで、エラーが発生しにくく、基本的には 2 行で済みます。

于 2012-11-12T20:13:20.133 に答える