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

您在正确的轨道上,但在堆栈已满之前您不应该循环- 不能保证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++一次——这会增加我们在字符串中的位置。正如您现在所做的那样,您实际上将位置增加了两次,因此只会推动其他所有角色。

于 2012-09-16T02:45:46.543 回答
0

在堆栈中使用 alinked list而不是。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 回答