简单说一下程序原理:这个程序本质是建立一个链栈并输出栈内元素,栈内元素为结构体Node,栈顶指针(*S)指向栈顶元素。InitList()是初始化栈顶指针,Push(S,e)是把e放到栈顶。Disp_t()是从栈顶开始向下输出栈内元素,Disp_b()是从栈底开始向上输出栈内元素。
所以假设程序开始运行时输入"abcde\n",那么应该输出一遍"edcba",再输出一遍"abcde"。但实际情况是输出一遍"edcba",再输出一遍"蚢bcde"(我测试了几遍,发现a变"蚢",b变"蚥",c变"蚦",d变"蚫"……)
也就是说Disp_t()这个函数可以正常执行,而Disp_b()输出的第一个字符会变成中文乱码。请问这是为什么?
补充:以上情况是在vc++6.0和CodeBlocks里编译运行时出现的。在runoob和dooccn.com这两个在线编译器里可以正常运行。
在网上看到cout输出中文出乱码的情况,可我这要输出的是英文字符啊。
#include <iostream>
#include<malloc.h>
using namespace std;
typedef struct StackNode
{
char data;
StackNode *under;
} Node;
void InitStack(Node *&s);
bool Push(Node *&s,char e);
bool Disp_t(Node *s);
bool Disp_b(Node *s);
int main()
{
Node *S=NULL;
char e;
InitStack(S);
while(e!='\n')
{
cin.get(e);
if(e!='\n')
Push(S,e);
}
Disp_t(S);
Disp_b(S);
}
void InitStack(Node *&s)
{
s=(Node *)malloc(sizeof(Node));
s->under=NULL;
}
bool Push(Node *&s,char e)
{
if(s==NULL)
{
cout<<"fail:No such a Stack exists!"<<endl;
return false;
}
if(s->data==0)//因为第一次放入元素时栈顶没有data(s->data==0),所以专门写一个if来给第一次放元素用
{
s->data=e;
return true;
}
Node *t;
t=(Node *)malloc(sizeof(Node));
t->under=s;
s=t;
s->under=t->under;
s->data=e;
return true;
}
bool Disp_t(Node *s)
{
if(s==NULL)
{
cout<<"NONE!"<<endl;
return false;
}
while(s!=NULL)
{
cout<<s->data;
s=s->under;
}
cout<<endl;
return true;
}
bool Disp_b(Node *s)
{
if(s==NULL)
{
cout<<"NONE!"<<endl;
return false;
}
/*Disp_b()的工作原理是先用t1记录s初始位置(栈顶),然后让s沉到栈底(s->under==t2,此时即s->under==NULL),再让t2上浮一位,指向栈底(t2=s),最后让s回到栈顶(s=t1),再让s开始下一轮下沉。如此循环,每循环一次,t2上浮一位,s下沉的距离也就少一位,直到t2上浮到栈顶的下一位*/
Node *t1=s,*t2=NULL;
while(s->under!=t2)
{
s=s->under;
if(s->under==t2)
{
cout<<s->data;
t2=s;
s=t1;
}
}
cout<<s->data<<endl;
free(t1);
free(t2);
return true;
}