(C ++)使用堆栈反转字符串?

时间:2014-10-27 21:44:58

标签: c++ stack reverse

我正在尝试使用堆栈来反转字符串。它正确地反转了字符串,但是当 i 达到0时for循环崩溃。我得到一个“字符串下标超出范围”错误。目前for循环只减少到1.如何才能将它推送并显示s1 [0]?

这是主要代码:

#include <cstdlib>     // Provides EXIT_SUCCESS
#include <iostream>    // Provides cin, cout
#include <stack>       // Provides stack
#include <string>      // Provides string
using namespace std;

. . .

string reverse(string & s1) 
{
    stack<char> stk1;
    string::size_type i;

    // this for loop sets the rest of the characters 
    for (i = s1.size() - 1; i > 0; i--)
    {
        stk1.push(s1[i]);
        cout << stk1.top();
    }

    return "The function was a success. Now that's what I call reverse psychology."; 
}

这是头文件:

#ifndef MAIN_SAVITCH_STACK1_H
#define MAIN_SAVITCH_STACK1_H
#include <cstdlib> // Provides size_t

namespace main_savitch_7A
{
    template <class Item>
    class stack
    {
    public:
        // TYPEDEFS AND MEMBER CONSTANT -- See Appendix E if this fails to compile.
        typedef std::size_t size_type;
        typedef Item value_type;
        static const size_type CAPACITY = 30;
        // CONSTRUCTOR
        stack( ) { used = 0; }
        // MODIFICATION MEMBER FUNCTIONS
        void push(const Item& entry);
        void pop( );
        // CONSTANT MEMBER FUNCTIONS
        bool empty( ) const { return (used == 0); }
        size_type size( ) const { return used; }
        Item top( ) const;
    private:
        Item data[CAPACITY];        // Partially filled array 
        size_type used;             // How much of array is being used
    };
}

#include "stack1.template" // Include the implementation.
#endif

这是堆栈实现(模板文件):

#include <cassert>  // Provides assert

namespace main_savitch_7A
{
    template <class Item>
    const typename stack<Item>::size_type stack<Item>::CAPACITY;

    template <class Item>
    void stack<Item>::push(const Item& entry)
    // Library facilities used: cassert
    {
        assert(size( ) < CAPACITY);
        data[used] = entry;
        ++used;
    }

    template <class Item>
    void stack<Item>::pop( )
    // Library facilities used: cassert
    {
        assert(!empty( ));
        --used;
    }

    template <class Item>
    Item stack<Item>::top( ) const
    // Library facilities used: cassert
    {
        assert(!empty( ));
        return data[used-1];
    }
}

我想将for循环更改为此,但它不起作用:

    // this for loop sets the rest of the characters 
    for (i = s1.size() - 1; i >= 0; i--) // i > -1 doesn't work either 
    {
        stk1.push(s1[i]);
        cout << stk1.top();
    }

    cout << s1[0] << "\n\n";

    return "The function was a success. Now that's what I call reverse psychology."; 
}

2 个答案:

答案 0 :(得分:0)

我是无符号的,所以如果它等于0则它会递减。你需要使用有符号的类型或检查边界条件而不涉及负数(也就是说,不要将它与 - 进行比较) 1,如果是0,则不减少。

答案 1 :(得分:0)

我可以想到以下几种选择。

使用string::size_type作为循环计数器:

string::size_type i;
for (i = s1.size(); i > 0; i--)
{
    stk1.push(s1[i-1]);
    cout << stk1.top();
}

使用int作为循环计数器:

int i = 0;
for (i = s1.size()-1; i >= 0; i--)
{
    stk1.push(s1[i]);
    cout << stk1.top();
}