0

現在の課題では、次のヘッダー ファイルを使用する必要があります。

#ifndef STACK_H
#define STACK_H

template <class T, int n>
class STACK
{
  private:
    T a[n];
    int counter;

  public:
    void MakeStack() {
        counter = 0;
    }

    bool FullStack() {
        return (counter == n) ? true : false ;
    }

    bool EmptyStack() {
        return (counter == 0) ? true : false ;
    }

    void PushStack(T x) {
        a[counter] = x;
        counter++;
    }

    T PopStack() {
        counter--;
        return a[counter];
    }
};

#endif

文を取得して「スタック」に格納し、逆に表示するプログラムを作成するには、ユーザーがこのプロセスを必要なだけ繰り返すことができるようにする必要があります。問題は、私は配列を使用することを許可されておらず (そうでなければ、これについての助けは必要ありません)、困惑していることです。

私が何をしようとしているのかを理解するために、投稿時の私のコードを次に示します。これは明らかに完全には機能しませんが、単に割り当てのアイデアを提供することを目的としています。

#include <iostream>
#include <cstring>
#include <ctime>
#include "STACK.h"
using namespace std;

int main(void)
{
    auto time_t a;
    auto STACK<char, 256> s;
    auto string curStr;
    auto int i;

    // Displays the current time and date
    time(&a);
    cout << "Today is " << ctime(&a) << endl;

    s.MakeStack();
    cin >> curStr;
    i = 0;
    do
    {
        s.PushStack(curStr[i]);
        i++;
    } while (s.FullStack() == false);

    do
    {
        cout << s.PopStack();
    } while (s.EmptyStack() == false);

    return 0;
} // end of "main"

更新 これは現在私のコードです

#include   <iostream>
#include   <string>
#include   <ctime>
#include   "STACK.h"
using namespace std;

time_t                      a;
STACK<char, 256>        s;
string             curStr;
int                     i;
int                     n;

// Displays the current time and date
time(&a);
cout << "Today is " << ctime(&a) << endl;

s.MakeStack();
getline(cin, curStr);
i = 0;
n = curStr.size();
do
{
   s.PushStack(curStr[i++]);
    i++;
}while(i < n);

do
{
    cout << s.PopStack();
}while( !(s.EmptyStack()) );    

return 0;
4

2 に答える 2

0

in スタックのlinked list代わりにa を使用します。array

リンクされたリストでは、常にリストの最後のノードのテール ポインターを格納します。各ノードは、前のノードへの参照を保持します。

A <--- B <---- C (tail)

押す:

A <--- B <---- C <---- D (tail)

ポップ:

A <--- B <---- C (tail)

// D is popped out

のとき、tail == nullそれが空のスタックであることがわかります

于 2012-09-16T03:51:51.530 に答える
0

あなたは正しい軌道に乗っていますが、スタックがいっぱいcurStrになるまでループするべきではありません.少なくとも256文字で構成されるという保証はありません. 代わりに、次のようにループします...

int n = curStr.size();
do {
  s.PushStack(curStr[i++]);
} while (i < n);

ここで、実際には<bool-expr> == falseor <bool-expr> == true... と書くべきではなく、それぞれ単に!<bool-expr>and と書くだけ<bool-expr>です。autoローカル変数にすべてのストレージ指定子が必要なわけでもありません。教授は、 を使用するのではなく、コンストラクターを使用することも検討する必要がありますMakeStack

編集: 私のコードの翻訳に問題があったようです。i++ループごとに 1 回だけ必要です。これにより、文字列内の位置がインクリメントされます。現在行っているように、実際には位置を 2 回インクリメントしているため、1 文字おきにプッシュしているだけです。

于 2012-09-16T02:45:46.543 に答える