数据结构 实验二 栈

数据结构 实验二  栈

 

首先,头文件与实验一相同,这里就不再赘述。可以参考实验一的头文件。

栈操作的相关实验代码:

#include <stdio.h>
#include <stdlib.h>

/*包含数据结构的预定义常量和类型P10 */
#include "DataHead.h"
/*文件名大于8位出错*/

/*定义元素类型为整数类型*/
typedef int SElemType;

/*栈的顺序存储表示*/
#define STACK_INIT_SIZE 4      /*  p46 */

#define STACKINCREMENT 1

typedef struct{
    SElemType *base;
    SElemType *top;
    int       stacksize;
}SqStack;

/*函数申明*/
Status InitStack(SqStack *L);   /*  p47 */
Status GetTop(SqStack S,SElemType *e);
Status Push(SqStack *L, SElemType e);   /* 进栈,插入 */
Status Pop(SqStack *L, SElemType *e);   /*  出栈,删除*/
void Out_Stack(SqStack L);    /*补充,输出打印栈*/

/*主函数*/
void main()
{
 int i,k,loc;     /* k ,菜单控制变量*/
 SElemType e,x;
 char ch;
 SqStack L;
 SqStack *p;
 system("graftabl 936");/*调用MS_DOS中文支持*/
 p=&L;/*p指向 L*/
 do{

    printf("\n\n\n========实验二:栈和队列 ===============");
    printf("\n        1.建立栈:构造一个空栈,并插入元素");
    printf("\n        2.入栈,插入元素");
    printf("\n        3.出栈,删除元素");
    printf("\n        4.取栈顶元素");
    printf("\n        5.输出显示栈内元素,从栈底到栈顶");
    printf("\n        0.结束程序运行");
    printf("\n=====================================");
    printf("\n        请输入您的选择(1,2,3,4,0)\n");

    scanf("%d",&k);
    switch(k)
    {
     case 1:{loc=InitStack(p);
            printf("\n请输入入栈元素个数,并依次输入整数类型的元素值");
            scanf("%d",&loc);
            for(i=1;i<=loc;i++) {
               scanf("%d",&e);
               Push(p, e);  /*也可以不处理函数返回值*/
               }
            Out_Stack(L);
            }break;
     case 2:{ 
         printf("\n请输入入栈元素的值:");
         scanf("%d", &e);
         Push(p,e);
         Out_Stack(L);
            }break;
     case 3:
         { 
             printf("\n请输入出栈元素个数");
             while(true)
             {
                 scanf("%d", &loc);
                 if(loc > p->top-p->base)
                     printf("\n!!出栈元素个数大于栈内所有元素个数!请重新输入!\n");
                 else
                     break;
             }
             printf("\n出栈元素为: ");
             for(i = 1; i <= loc; i++)
             {
                 Pop(p, &e);
                 printf("%8d ", e);
             }
             Out_Stack(L);
         }break;
     case 4:
         {
             GetTop(L, &e);
             printf("当前栈顶元素为: %d", e);
         }; break;
     case 5:{Out_Stack(L);
            }; break;
     case 0:{exit(0);}
    }
  }while(k!=0);
  ch =getchar();
}




Status InitStack(SqStack *S) {  /*  p47 */
  /*  构造一个空栈 */
  S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
  if (!S->base) exit(OVERFLOW);        /*  存储分配失败 */
  S->top = S->base;
  S->stacksize = STACK_INIT_SIZE;   /*  初始存储容量 */
  return OK;
} /*  InitStack */

Status GetTop(SqStack S, SElemType *e) {  /*  p47 */
    if(S.base == S.top)        return ERROR;
    e = S.top - 1;
    return OK;
} /*  GetTop */

 
Status Push(SqStack *S, SElemType e) {  /*  P47 */

  if (S->top-S->base >= S->stacksize) {   /*  当前存储空间已满,增加容量 */
    S->base = (SElemType *)realloc(S->base,
                  (S->stacksize+STACKINCREMENT)*sizeof (SElemType));
    if (!S->base) exit(OVERFLOW);   /*  存储分配失败 */
    S->top = S->base+S->stacksize;
    S->stacksize += STACKINCREMENT;  /*  增加存储容量 */
  }
  *S->top++ = e;       /* 个人的一些补充说明:由于栈中的top指针指向栈中即将赋值的空闲存储地址,所以先将e的值赋给top指针所指向的存储空间,然后再将top指针向后移动一位*/
  return OK;
} /*  Push */


void Out_Stack(SqStack L){
    int *i;
    printf("\n当前栈内元素从栈底到栈顶为:");
    for(i=L.base;i<L.top;i++) printf("%10d",*i);
}

Status Pop(SqStack *S, SElemType *e) {  /*  p47 */
    if(S->base == S->top)
        return ERROR;
    *e = *--S->top;
    return OK;
} /*  Pop */

可以复制上述代码,也可以去我的网盘下载cpp源文件。

http://pan.baidu.com/s/1mWOwO 

 

 

posted @ 2013-11-14 00:37  云端之上  阅读(459)  评论(0编辑  收藏  举报