【数据结构】链栈学习及运用笔记



     上午再一次深入复习了栈的算法实现,写了一个简单的十进制转二进制函数作为练习(以后有时间的时候再将其中关键部分用图文描述出来,加深印象的同时也希望能够帮助初学者更好的理解这部分的知识),代码如下:

// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;
//==================以下是栈的数据结构和方法=================
typedef struct Stack{
 int data;
 struct Stack* Next;
}Stack;//栈结构定义
void initStack(Stack* &S)//初始化栈,带头结点的栈
{
 S = (Stack*)malloc(sizeof(Stack));
 S->Next = NULL;
}
int StackEmpty(Stack* S)//判断栈是否为空
{
 if (S->Next == NULL)
  return 1;
 else
  return 0;
}
void StackPush(Stack* S, int x)//入栈
{
 Stack* p = (Stack*)malloc(sizeof(Stack));//申请一个结点
 p->Next = NULL;
 p->data = x;

 p->Next = S->Next;//令新结点的Next指针指向首结点
 S->Next = p;//将头结点的Next指针指向新结点
}
int StackPop(Stack* S, int &x)//出栈
{
 if (S->Next == NULL)//判断栈是否为空
  return 0;
 else
 {
  Stack* p = S->Next;//令p指向栈顶结点
  S->Next = p->Next;//令头结点的Next指针指向栈顶结点的下一个结点,之前的栈顶结点的下一个结点变为新的栈顶结点
  x = p->data;//将之前栈顶结点的值赋给x
  free(p);//释放之前的栈顶结点
  return 1;
 }
}
//===========以下是运用栈进行10进制转2进制的函数====================
void Transfer(int x)
//只能对大于0的十进制进行二进制转换
{
 int temp = x;
 Stack* S;
 initStack(S);
 while (x != 0)//判断x是否为零
 {
  StackPush(S, x % 2);//将x除2的余数入栈
  x = int(x / 2);//x除2,并向下取整
 }
 cout << temp << " transfer to binary is:\n";
 while (!StackEmpty(S))
 {
  StackPop(S, x);//出栈并打印
  cout << x << ' ';
 }
 cout << '\n';
}
int _tmain(int argc, _TCHAR* argv[])
{
 for (int i = 1; i < 11;i++)
  Transfer(i);
 cout << "\ndone!\n";
 return 0;
}

/*=======================在VS2013中的输出结果======================
1 transfer to binary is:
1
2 transfer to binary is:
1 0
3 transfer to binary is:
1 1
4 transfer to binary is:
1 0 0
5 transfer to binary is:
1 0 1
6 transfer to binary is:
1 1 0
7 transfer to binary is:
1 1 1
8 transfer to binary is:
1 0 0 0
9 transfer to binary is:
1 0 0 1
10 transfer to binary is:
1 0 1 0

done!
请按任意键继续. . .
*/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章