您的位置:首页 > 理论基础 > 数据结构算法

数据结构 实验二 栈

2013-11-14 00:37 330 查看

数据结构 实验二 栈

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

栈操作的相关实验代码:

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: