#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");//用於函數輸出屏幕暫停,以便觀察
}