呵呵,说更新就肯定会写的拉~~~

  1. /*******************************************  
  2. DS_LinkStack  
  3. By_h4breeez  
  4. Date:April.24th,2012  
  5. *******************************************/ 
  6. #include<iostream>  
  7. using namespace std;  
  8.  
  9. typedef struct StackNode{                                //行了,是链栈。链栈每个节点的数据结构:元素+指向下一个元素的指针  
  10.     int elem;  
  11.     struct StackNode *next;  
  12. }Node;  
  13.  
  14. typedef struct{                                         //链栈的数据结构  
  15.     Node *Top;  
  16. }LinkStack;  
  17.  
  18. void InitStack(LinkStack *s)                          //初始化一个链栈,把头指针清零。但这里如果debug可以发现可以查看  
  19. {                                                      //top指向的elem和next,显示为能被引用。(因为top是NULL啊,违法访问了)          
  20.     s->Top = NULL;  
  21. }  
  22.  
  23. int StackEmpty(LinkStack *s)                        //判栈空  
  24. {  
  25.     return NULL == s->Top;  
  26. }  
  27.  
  28. void Push(LinkStack *s,int elem)                   //压入一个元素到栈中,进栈  
  29. {  
  30.     Node *p = (Node *)malloc(sizeof(Node));  
  31.     p->elem = elem;  
  32.     p->next = s->Top;                            //遇到指针转换就安心画图吧,刚开始时这样最能帮你理解了  
  33.     s->Top = p;  
  34. }  
  35.  
  36. int Pop(LinkStack *s)  
  37. {  
  38.     int elem;  
  39.     Node *p = (Node *)malloc(sizeof(Node));        
  40.     p->elem = 0;  
  41.     p->next = NULL;                         //最好对刚分配的内存初始化,方便  
  42.     if( StackEmpty(s) )  
  43.     {  
  44.         cout << "Empty Stack!" << endl;  
  45.         return -1;  
  46.     }  
  47.     else 
  48.     {  
  49.     elem = s->Top->elem;  
  50.     p = s->Top;  
  51.     s->Top = p->next;  
  52.     free(p);  
  53.     return elem;  
  54.     }  
  55. }  
  56.  
  57. int StackTop(LinkStack *s)                   //取得栈顶元素  
  58. {  
  59.     if( StackEmpty(s) )  
  60.     {  
  61.         cout << "Empty Stack!" << endl;  
  62.         return -1;  
  63.     }  
  64.     else 
  65.         return s->Top->elem;  
  66. }  
  67.  
  68. void PrintStack(LinkStack *s)                  //打印栈内元素,和pop不一样哦。这里只是查看栈内的元素  
  69. {  
  70.     LinkStack *p1 = (LinkStack *)malloc(sizeof(LinkStack)); ///////////////////////////////////////////////////////////  
  71.     LinkStack *p2 = (LinkStack *)malloc(sizeof(LinkStack));  
  72.     p1->Top = s->Top;  
  73.     p2->Top = s->Top;                    //重新用两个指针来操作,不想动s,要不后续容易出错,                                                      
  74.     while(!StackEmpty(p1))              //特别是先进栈,然后打印,然后进栈,然后再打印,指针变换不好掌握,所以这里我没有动s  
  75.     {  
  76.         cout << p1->Top->elem << endl;  
  77.         p2->Top = p1->Top->next;  
  78.         p1->Top = p2->Top;  
  79.     }  
  80.     free(p1);  
  81.     free(p2);  
  82. }  
  83.  
  84. int main()  
  85. {  
  86.     LinkStack *stack = (LinkStack *)malloc(sizeof(LinkStack));  
  87.     int choice = 0,elem = 0;  
  88.     InitStack(stack);  
  89.     cout << "\t0 to push elements---1 to pop elements\n\t2 to get top element---3 to print all elements---other to exit!" << endl;  
  90.     cin >> choice;                        //如果输入字母会出错  
  91.     if(cin.fail())                         //所以要在这里对输入流做检测,可以放到while里,但不够美观,还有另外方法处理,见末尾  
  92.     {  
  93.         cout << "input error!" << endl;  
  94.     }  
  95.     else 
  96.     {  
  97.     while( choice == 0||choice == 1||choice == 2||choice == 3 )  
  98.     {  
  99.         switch(choice)  
  100.         {  
  101.         case 0:  
  102.             cout << "Input element to push in the stack!" << endl;  
  103.             cin >> elem;  
  104.             Push(stack,elem);  
  105.             cout << "done" << endl;  
  106.             break;  
  107.         case 1:  
  108.             cout << "No pop a element!" << endl;  
  109.             if(!StackEmpty(stack))  
  110.             {  
  111.                 elem = Pop(stack);  
  112.                 cout << elem << endl;  
  113.             }  
  114.             else 
  115.                 cout << "Empty stack!" << endl;  
  116.             break;  
  117.         case 2:  
  118.             cout << "No pop the top element!" << endl;  
  119.             if(!StackEmpty(stack))  
  120.             {  
  121.                 elem = StackTop(stack);  
  122.                 cout << elem << endl;  
  123.             }  
  124.             else 
  125.                 cout << "Empty stack!" << endl;  
  126.             break;  
  127.         case 3:  
  128.             if(!StackEmpty(stack))  
  129.             {   cout << "No print all elements!" << endl;  
  130.                 PrintStack(stack);  
  131.             }  
  132.             else 
  133.             {  
  134.                 cout << "Empty stack!" << endl;  
  135.             }  
  136.             break;  
  137.         default:  
  138.             exit(0);  
  139.         }  
  140.         cout << "New choice:";  
  141.         cin >> choice;  
  142.     }  
  143.     }  
  144.     return 0;  
  145. }  
  146. /********************************************************************************************************  
  147. 1.关于输入流的检测 cin.fail(),cin.clear(),cin.ingore();  
  148.   cin.fail(),实例如上;  
  149.   方法核心:      
  150.      cin.clear();                             //清除cin流      
  151.      cin.ignore(1024,'\n');                  //cin.ignore(1024, '\n')的含义是把缓冲区内从当前字符开始直到  
  152.                                                 '\n'之前字符(如果有1024个的话)忽略掉,实际上这里假设一行  
  153.                                                 不会超过1024个字符,所以含义是忽略一行  
  154.  
  155. 2.栈的应用  
  156.       表达式求值  
  157.       子程序嵌套  
  158.       递归调用  
  159. **********************************************************************************************************/