C++栈的开发问题

#include<iostream>
using namespace std;

typedef struct Node
{
    char data;
    Node *pNext;
}NODE, *PNODE;

typedef struct Stack
{
    PNODE pTop;
    PNODE pBottom;
}STACK, *PSTACK;

void init(PSTACK pS);
void push(PSTACK pS);
void traverse(PSTACK pS);
int main()
{
    STACK S ;
    init(&S);
    push(&S);
    traverse(&S);
    return 0 ;
}

//栈的初始化
void init(PSTACK pS)
{
    pS -> pTop = new Node;

    if(NULL == pS -> pTop)
    {
        printf("动态内存分配失败!");
    }
    else
    {
        pS -> pBottom = pS -> pTop;
        pS -> pTop -> pNext = NULL;
    }

    return ;
}

//插入元素到栈顶
void push(PSTACK pS)
{
    char temp;
    do
    {
        cin>>temp;
        if(temp=='$')
        {
            PNODE r = pS -> pTop;
            temp = pS -> pTop -> data;
            pS -> pTop = r -> pNext;
            delete r;
        }
        if(temp!='#')
        {
            PNODE pNew = new Node;
            pNew -> data = temp;
            pNew -> pNext = pS -> pTop;
            pS -> pTop = pNew;
        }
    } while (temp!='#');

    return ;
}

//遍历栈S
void traverse(PSTACK pS)
{
    PNODE p = pS -> pTop;

    printf("栈内元素为:");
    while(p != pS -> pBottom)
    {
        cout<<p->data;
        p = p -> pNext;
    }

    printf("\n");
    return ;
}

这个代码意思是遇到#结束,遇到$就是压栈。比如输入11111$#,输出11111

如果temp = pS -> pTop -> data;删去,输出就变成$1111,请问出了什么问题?
还有删除栈顶元素,一定要temp = pS -> pTop -> data;这句嘛?这句什么用?

阅读 2.6k
1 个回答

不是很明白这个代码的意图,但是如原代码所写,遇到$的时候在第一个if里,把栈顶的元素删掉($前面那个字符),可是同时把temp也改成了栈顶元素的值,到第二个if又给把这个元素压回栈顶了。所以等于没做什么处理,只是换了个内存空间保存变量。如果去掉你说的那句话,temp就一直是$,那$会被压入栈顶,而原栈顶元素被删除。这就是你得到$1111的原因,实际上去掉那句话后,这个代码变成了删除$前面的字符的逻辑。

我猜想也许你这个代码在第二个if上漏了一个else,原意是将$前面的字符删除,有几个$就删几个,可能是这意思。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题