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