实验三 顺序栈


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

using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int SElemType;

//00定义数据元素,数据结构,其中元素为原子类型不用结构体,数据结构包含三个域需要用结构体
#define STACK_INIT_SIZE 100 // 存储空间初始分配量   看清实验题干要求,不是maxsize
typedef struct {
        SElemType *base; // base的初值为NULL
        SElemType *top; // 栈顶指针
        int stacksize; // 当前已分配的存储空间,以元素为单位
} SqStack;

//01 初始化一个顺序栈S
Status InitSStack(SqStack &S)
{
        S.base=new SElemType[STACK_INIT_SIZE];
        if(!S.base)
                exit(OVERFLOW);
        S.top=S.base;//不能互换,前面已经给base赋过值了,这是给top赋值。互换了,不仅base错了,top也没有值。
        S.stacksize=STACK_INIT_SIZE;
        return OK;
}

//02 随机创建一个正整数值的栈(当输入-1时创建结束 )
Status CreateSStack(SqStack &S)
{
        if(!S.base)

        InitSStack(S);

        int i=0;
        int n;
        while(i<S.stacksize)
        {
                cin>>n;
                if(n!=-1)
                {
                        *S.top=n;
                        S.top++;
                }
                else
                        break;//跳出while循环用break,程序接着执行while后面的代码;跳出程序用return;

        }
        return OK;

}

//03 入栈
Status Push(SqStack &S,SElemType e)//S是一个结构体变量,不是指针,函数要修改实参栈的值,故而&S,即形参变了要让实参的值也一块变, 而e的值不需返回故不加&
{
        if(S.top-S.base==S.stacksize)
                return ERROR;
        *S.top++=e;//入栈是对栈S的操作,top指针要变,S也跟着变,故形参要&S;
        return OK;
}

//04 将栈顶元素弹出, 并在弹出结束后输出弹出元素的值;
Status Pop(SqStack &S,SElemType &e)//S同上,同时,e的值要传递给实参,让实参的值变成e,因此也要&e。
{
        if(S.top==S.base)
        {
                printf("空栈\n");
                return ERROR;
        }
        e=*(--S.top);//栈顶指针要变,先--,后把栈顶元素值返回,代码执行完,栈整体就少了一个元素
        return OK;
}

//05 输出栈顶元素的值
Status GetTop(SqStack S,SElemType &e)//e的值要传回给实参,因此要&e,但S的值不需传回实参,也就是函数功能上没要求改变主函数中的实参,故不用加&。
{
        if(S.top==S.base)
        {
                printf("空栈\n");
                return ERROR;
        }
        e=*(S.top-1); //返回栈顶元素,但栈顶指针不能变,所以不能S.top--。

        return OK;
}
//06求栈的长度;

Status GetLength(SqStack S,SElemType &len)//e的值要传递给实参,因此要&e,但S的值没变不用加&。
{
       if(S.top==S.base)
       {
              printf("空栈\n");
              return ERROR;
       }
       len=S.top-S.base;
       return OK;
}

//07 输出从栈底到栈顶的所有元素,不能改变栈,如TOP指针等。
Status DisplaySStack(SqStack S)
{
        if(S.top==S.base)
        {
                printf("空栈\n");
                return ERROR;
        }
        int *p=S.base;
        while(p<S.top)
        {
                cout<<*(p++)<<" "; //==printf("%d",*(p++));
        }

        /*输出从栈顶到栈底的所有元素
                int *p=S.top;
                while(p>S.base)
                {
                        p--;
                        cout<<*(p)<<" ";
                }
        */
        return OK;
}

void main()
{
        SqStack S;

        int i=InitSStack(S);//01栈的初始化
        printf("栈初始化状态:%d\n栈的长度是:%d\n",i,S.stacksize);//测试栈是否初始化成功

        CreateSStack(S);//02栈的创建 
        printf("栈底到栈顶的元素是:");
        DisplaySStack(S); 

printf("\n入栈一个数,请输入:");
int x;
cin>>x;
Push(S,x);//03入栈
DisplaySStack(S);

int y;
printf("\n弹出栈顶元素是:");
Pop(S,y);//04出栈
cout<<y<<endl;
DisplaySStack(S);

int z;
printf("\n读取栈顶元素:");
GetTop(S,z);//05读栈顶元素
cout<<z<<endl;
DisplaySStack(S);

int len;
printf("\n栈的长度是:");
GetLength(S,len);//06读栈长
cout<<len<<endl;

cout<<"当前栈是:";

DisplaySStack(S);//07打印当前栈

        system("pause");//用于函数输出屏幕暂停,以便观察
}

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM