2013-03-26 3 views
1

У меня есть назначение, где я могу взять один стек, показать вывод, а затем отменить его, чтобы показать вывод.как перевернуть стек

Его предполагают, чтобы выглядеть следующим образом

Stack: 
262 115 74 26 34 243 22 734 113 121 
Stack Reversed: 
121 113 734 22 243 34 26 74 115 262 

Вместо шахты выходит как этот

Stack: 
262 115 74 26 34 243 22 734 113 121 121 113 734 22 243 34 26 74 115 262 
Stack Reversed: 

Может кто-то пожалуйста, посмотрите на мой код и посмотреть, что происходит. Я пробовал немало вещей, но не могу заставить работать.

#include <stdio.h> 
#include <iostream> 

#include "linkedStack.h" 

using namespace std; 

template <class Type> 
void printStack(linkedStackType<Type>& stack); 

template <class Type> 
void reverseStack(linkedStackType<Type>& stack); 

int main(int argc, char **argv) 
{ 
    // Declare stack variables 
    linkedStackType<int> stack; 

    // Add some data to the stack 
    stack.push(121); 
    stack.push(113); 
    stack.push(734); 
    stack.push(22); 
    stack.push(243); 
    stack.push(34); 
    stack.push(26); 
    stack.push(74); 
    stack.push(115); 
    stack.push(262); 

    cout << "\nStack:\n "; 
    printStack(stack); 

    reverseStack(stack); 

    cout << "\nStack Reversed:\n "; 
    printStack(stack); 

    cout << "\n\n** Press any key to continue **\n"; 
    getchar(); 

    return 0; 
} 

template <class Type> 
void printStack(linkedStackType<Type>& stack) 
{ 
    Type item; 
    linkedStackType<Type> tmpStack = stack; 

    while (stack.isEmptyStack() == false) 
    { 
     item = stack.top(); 
     stack.pop(); 
     cout << item << " "; 
    } 

    stack = tmpStack; 



} 

template <class Type> 
void reverseStack(linkedStackType<Type>& stack) 
{ 
    Type item; 
    linkedStackType<Type> tmpStack; 

    while (stack.isEmptyStack() == false) 
    { 
     item = stack.top(); 
     stack.pop(); 
     tmpStack.push(item); 
    } 

    while (tmpStack.isEmptyStack() == false) 
    { 
     item = tmpStack.top(); 
     tmpStack.pop(); 
     stack.push(item); 
     cout << item; 

    } 

    stack = tmpStack; 


    return; 
} 
+1

Будет очень сложно помочь вам, не имея возможности увидеть код, связанный с 'linkedStackType'. –

+0

Не решение, но код копирует стек четыре раза. Это легко сделать до двух экземпляров. Это можно сделать только с одной копией. –

+0

@sharth: На самом деле, хотя бы одна ошибка указана в коде, так что это меньше проблема, чем обычно. –

ответ

9

Я не 100%, но я думаю, что ваш код будет работать, если вы удалите секунду, а петли reverseStack.

template <class Type> 
void reverseStack(linkedStackType<Type>& stack) 
{ 
    Type item; 
    linkedStackType<Type> tmpStack; 

    while (stack.isEmptyStack() == false) 
    { 
     item = stack.top(); 
     stack.pop(); 
     tmpStack.push(item); 
    } 

    //while (tmpStack.isEmptyStack() == false) 
    //{ 
    // item = tmpStack.top(); 
    // tmpStack.pop(); 
    // stack.push(item); 
    // cout << item; 
    //} 

    stack = tmpStack; 
    return; 
} 
+0

Да! Это изменение дает желаемый результат. 100% –

1

У вас есть посторонний цикл печати в reverseStack(), который печатает значения в неположенном месте. Кроме того, этот цикл печати очищает ваш tmpStack. Это объясняет результат.

1

Ваш второй while петля пуст tmpStack, но затем вы назначаете пустой стек на stack, так что у вас просто пустой стек.

+1

@SongWang: нет, стек никогда не удваивается. Он просто печатается дважды, прежде чем полностью его стереть. –

+0

Спасибо за объяснение .. Это имеет смысл. Я сижу здесь, пытаясь понять, что добавить, и это так же просто, как убрать предметы. –

+0

Спасибо, что указали это, Mooing Duck. Песня Ванга, да, это тоже помогло мне, но потом я увидел, что «Stack Reversed» не имеет ничего ниже. –

-1
void sortStack(struct stack **s) 
{ 
if (!isEmpty(*s)) 
    { 
    int x = pop(s); 
    sortStack(s); 
    sortedInsert(s, x); 
    } 
} 

void sortedInsert(struct stack **s, int x) 
{ 
    if (isEmpty(*s) || x > top(*s)) 
    { 
    push(s, x); 
    return; 
    } 
int temp = pop(s); 
sortedInsert(s, x); 
push(s, temp); 
} 
+0

Некоторое описание о вашем коде было бы неплохо для последующего последующего наблюдения. – GHajba