数据结构-栈实验

2025-03-13 14:56:41
推荐回答(1个)
回答1:

# include
# include

typedef struct student //声明节点
{
 char date;
 struct student * next;
}NODE,* PNODE;

typedef struct stack//声明栈入口
{
 PNODE top;
 PNODE bottom;
}STACK,* PSTACK;

void initstack(PSTACK ps);//初始化参数  参数1.栈入口的地址
void push(PSTACK,char);//压入一个数据  参数1.栈入口的地址 参数2.需要压入的数据
bool pop(PSTACK,char *);//将一个数据出栈  参数1.栈入口的地址 参数2.需要保存出栈的数据地址 ,出栈失败返回 FALSE 真返回 TURE
void trversal(PSTACK ps);//遍历一个栈的数据  参数1.栈的地址

int main(void)
{
 STACK ps;
 int avl;
 char ch;


 initstack(&ps);
 printf("请输入需要进栈字符,字符与栈顶元素相同,则弹出栈顶元素,否者压入栈。\n如果接收的字符为‘$’则停止输入\n");
 do
 {
  
  scanf("%c",&ch);
  getchar();

  if(ch == '$')
   break;
  else if(ch == ps.top->date)
   pop(&ps,&ch);
  else
   push(&ps,ch);

 

 }while (1);

 
 

 printf("栈的数据为");
 trversal(&ps);

 

 return 0;
}

void initstack(PSTACK ps)
{
 ps->top = (PNODE)malloc(sizeof(NODE));//创建新节点
 if(ps->top == NULL)
 {
  printf("初始化栈失败!\n");
  exit(-1);
 }
 else
 {
  printf("完成初始化!\n");
  ps->bottom = ps->top; //设置栈底
  ps->bottom->next = ps->top->next = NULL; //将栈底节点指向设置为NULL
 }
 
 return;

}

void push(PSTACK ps,char avl)
{
 PNODE pnew = (PNODE)malloc(sizeof(NODE));
 if(pnew == NULL)
 {
  printf("分配内存失败!");
  exit(-1);
 }

 pnew->date = avl; //设置想节点数据
 pnew->next = ps->top;//将顶部节点地址设置为新节点指向地址

 ps->top = pnew;//将新节点设置为顶部地址

 

 return;
}

bool pop(PSTACK ps,char * avl)
{
 PNODE dell;

 if(ps->top->next == NULL) //如果为空栈底返回
 {
  return false;
 }
 else
 {
  dell = ps->top; //保存原始顶层栈地址
  * avl = ps->top->date; //保存顶层数据
  ps->top = ps->top->next;//设置下一层地址为顶层地址

  free(dell);
  dell = NULL;
 }

 return true;
}

void trversal(PSTACK ps)
{
 PNODE ph;
 ph = ps->top;

 while(ph->next != NULL)//如果不为 头节点
 {
  printf("%c ",ph->date);//输出数据
  ph = ph->next;//设置为下一节点

 }
 printf("\n");

 return;
}