#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#define ElemType char
#define Status int
#define StackInitSize 100
//其實也可以寫成 typedef int ElemType;
//棧的順序結(jié)構(gòu)表示
typedef struct
{
ElemType* base;
ElemType* top;
int stacksize;
}seqstack;
//初始化一個順序棧
Status InitStack(seqstack& s)//傳遞的是地址
{
s.base = (ElemType*)malloc(StackInitSize * sizeof(ElemType));
if (!s.base)
{
return 0;
}
s.top = s.base;
s.stacksize = StackInitSize;
return 1;
}
//創(chuàng)建棧
Status CreateStack(seqstack &s)//其實不是特別清楚什么時候傳遞的參數(shù)為地址
{
int m = 0;
char n;//n作為接收從鍵盤中輸入的值
printf("請輸入元素,若輸入完成則輸入$:\n");
//getchar();
while (m < StackInitSize)
{
//scanf_s("%c", &n);
n = getchar();
if (n != '$')
{
*s.top = n;//把值放進棧里邊,雙重指針表非指針,嘿嘿
s.top++;//頭結(jié)點往上移動
}
else
return 1;
//scanf_s("%c", &n);
//if (n == '$')
// return 1;
//*s.top = n;//將n的值賦給top
//s.top++;//頭結(jié)點往上移動
m++;
}
}
//判斷棧是否為空
Status StackEmpty(seqstack s)
{
if (s.top == s.base)
return 0;
else
return 1;
}
//遍歷輸出棧內(nèi)元素
//(因為要對棧進行判空操作,則先寫判空)
Status print(seqstack s)
{
ElemType* i;
i = s.top;//服從后進先出的原則
if (StackEmpty(s) == 0)
{
printf("--此棧為空棧--\n");
return 0;
}
while (i > s.base)
{
i--;
printf("%c", *i);
}
printf("\n");
return 1;
}
//進行入棧操作的編寫,入棧之前需要進行判滿的操作
Status PushStack(seqstack& s, ElemType& e)
{
if (s.top - s.base == 0)//判滿
{
printf("--此棧已滿--\n");
return 0;
}
else
*s.top++ = e;//把頭結(jié)點向上移動后,把e的地址作為頭結(jié)點的地址域
}
//出棧,后進先出,則該元素為棧頂元素
char PopStack(seqstack& s)
{
if (StackEmpty == 0)
{
printf("--此棧為空棧--\n");
return 0;
}
else
{
char e;
s.top--;//因為頭結(jié)點指向棧頂元素的上一個節(jié)點,所以需要下移指向棧頂元素
e = *s.top;// 實際上此元素并沒真正刪除,仍在S.top中,
//但是如果插入元素,就會被更新,就像是刪除了一樣
return e;
}
}
//主函數(shù)
int main()
{
seqstack s;
InitStack(s);
//printf("%d", InitStack(s));//初始化后,檢驗初始化是否完成
printf("---創(chuàng)建一個順序棧---\n");
CreateStack(s);
/*
int a = CreateStack(s);
printf("%d", a);//創(chuàng)建棧后,檢驗創(chuàng)建是否完成
*/
printf("---此刻棧是否為空?---\n");
if (StackEmpty(s) == 1)
printf("--此棧不為空--\n");
else
printf("--此棧為空棧--\n");
printf("---打印這個順序棧:---\n");
print(s);
printf("---進行入棧操作---\n");
printf("---請輸入要入棧的字母---\n");
getchar();
char a;
scanf_s("%c", &a);
PushStack(s, a);
printf("---打印這個順序棧:---\n");
print(s);
printf("---進行出棧操作---\n");
char b;
b = PopStack(s);//取棧頂元素
printf("--出棧的元素是%c--\n", b);
printf("---打印這個順序棧:---\n");
print(s);
return 0;
}
以上為總的代碼,對于棧滿時存在一些問題待改進
————————————————————————————————————————
以下為代碼編寫過程,有參考網(wǎng)上大佬的代碼
?
創(chuàng)建棧后報錯,在scanf_s處缺少&符號?
會執(zhí)行兩遍創(chuàng)建棧?
?
在主函數(shù)里邊確實有兩個?
修改后,基本邏輯沒有問題,但是需要輸出棧的元素,才能夠進一步確定是否成功創(chuàng)建棧
遍歷輸出棧的元素,首先需要對棧進行判空操作,則首先進行判空
//判斷棧是否為空
Status StackEmpty(seqstack s)
{
if (s.top == s.base)
return 0;
else
return 1;
}
//輸入棧是否為空
void PrintStackEmpty(seqstack s)
{
if (StackEmpty(s) == 1)
printf("--此棧不為空--\n");
else
printf("--此棧為空棧--\n");
}
?本來想在主函數(shù)里簡單化,但是吧,輸出就太簡單了
printf("---此刻棧是否為空?---\n");
void PrintStackEmpty(seqstack s);
?這是為什么呢?
先檢驗一下吧,
printf("---此刻棧是否為空?---\n");
if (StackEmpty(s) == 1)
printf("--此棧不為空--\n");
else
printf("--此棧為空棧--\n");
兩種情況都為空,emmm,直覺告訴我是在創(chuàng)建棧的時候出現(xiàn)了問題
?
?對比網(wǎng)上資源之后發(fā)現(xiàn),是在傳遞參數(shù)時,別人傳的時地址,我傳的是結(jié)構(gòu)體,但是吧其實不是特別清楚什么時候傳遞的參數(shù)為地址
修改后,
//創(chuàng)建棧
Status CreateStack(seqstack &s)//其實不是特別清楚什么時候傳遞的參數(shù)為地址
{
int m = 0;
char n;//n作為接收從鍵盤中輸入的值
printf("請輸入元素,若輸入完成則輸入$:\n");
//getchar();
while (m < StackInitSize)
{
//scanf_s("%c", &n);
n = getchar();
if (n != '$')
{
*s.top = n;//把值放進棧里邊,雙重指針表非指針,嘿嘿
s.top++;//頭結(jié)點往上移動
}
else
return 1;
//scanf_s("%c", &n);
//if (n == '$')
// return 1;
//*s.top = n;//將n的值賦給top
//s.top++;//頭結(jié)點往上移動
m++;
}
}
?成功了哦,哈哈哈,再稍微修改一下下
修改之后發(fā)現(xiàn)
咋說呢
不止一條語句,要花括號括起來,檢驗的重要性
?接下來進行入棧操作,入棧之前需要進行判滿的操作
//進行入棧操作的編寫,入棧之前需要進行判滿的操作
Status PushStack(seqstack& s, ElemType& e)
{
if (s.top - s.base == 0)//判滿
return 0;
else
*s.top++ = e;//把頭結(jié)點向上移動后,把e的地址作為頭結(jié)點的地址域
}
出棧文章來源:http://www.zghlxwxcb.cn/news/detail-743130.html
//出棧,后進先出,則該元素為棧頂元素
char PopStack(seqstack& s)
{
if (StackEmpty == 0)
{
printf("--此棧為空棧--\n");
return 0;
}
else
{
char e;
s.top--;//因為頭結(jié)點指向棧頂元素的上一個節(jié)點,所以需要下移指向棧頂元素
e = *s.top;// 實際上此元素并沒真正刪除,仍在s.top中,
//但是如果插入元素,就會被更新,就像是刪除了一樣
return e;
}
}
取棧頂元素和即為棧頂元素出棧文章來源地址http://www.zghlxwxcb.cn/news/detail-743130.html
到了這里,關(guān)于順序棧的基本操作(存儲結(jié)構(gòu)設計、初始化、判空、判滿、入棧、出棧、取棧頂元素、遍歷輸出棧內(nèi)元素)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!