棧(Stack):插入和刪除只在一端的線性表就是棧
結(jié)構(gòu):
棧底(base):不能進行插入和刪除的一端就是棧底。
棧頂(top):可以插入刪除的那一端就是棧頂。
棧頂(top):可以插入刪除的那一端就是棧頂。
初始值:base = 0;top = 0;棧底的初始值即位置不會改變,每進棧一條數(shù)據(jù),棧頂?shù)奈恢枚紩l(fā)生改變,當(dāng)沒有數(shù)據(jù)時棧頂?shù)某跏嘉恢脼?;
進棧(插入數(shù)據(jù))push:將新值插入到棧頂位置,同時棧頂改變一個位置
data[top] = A;
top ++;
棧滿:當(dāng)棧頂?shù)闹档扔跅5拇箝L度時,說明棧滿。
top == maxsize - 1
出棧(刪除)POP:往下改變棧頂?shù)奈恢眉纯伞?br />top --;
出棧(刪除)POP:往下改變棧頂?shù)奈恢眉纯伞?br />top --;
1.定義
struct Stack {int data[maxLength];
int base;
int top;
};
2.初始化
struct Stack * initStack() {struct Stack *s = (struct Stack *)malloc(sizeof(struct Stack));
s->base = 0;
s->top = s->base;
return s;
}
3.判斷棧是否為空
int isNull(struct Stack *s) {if (s->base == s->top) {return 1;//空
}
else {return 0;
}
}
4.判斷棧是否滿
int isFull(struct Stack *s) {if (s->top == maxLength) {return 1;//滿
}
else {return 0;
}
}
5.進棧
int push(struct Stack * s,int data) {s->data[s->top] = data;
s->top++;
}
6.出棧
int pop(struct Stack *s) {int data = s->data[s->top-1];
s->top--;
return data;
}
7.main函數(shù)測試
//程序入口
void main() {//初始化
struct Stack *s = initStack();
if (s!=NULL) {printf("--->>>初始化成功\n");
}
//判斷棧是否為空
if (!isNull(s)) {printf("--->>>棧不為空\n");
}else {printf("--->>>棧為空\n");
}
//判斷棧滿
if (isFull(s)) {printf("--->>>棧滿\n");
}
else {printf("--->>>棧不滿\n");
}
//進棧
while (1) {if (isFull(s)) { printf("--->>>棧滿,不允許繼續(xù)插入\n");
}
int data;
printf("請輸入進棧數(shù)據(jù)(0結(jié)束):");
scanf_s("%d",&data);
if (data == 0) { printf("--->>>輸入結(jié)束\n");
break;
}
push(s,data);
}
//出棧
printf("出棧了一個數(shù)據(jù):%d\n",pop(s));
}
補充:棧的應(yīng)用int hexadecimalConversion(struct Stack * s,int num,int intoSystem) {while (num>0) {s->data[s->top] = num % intoSystem;
s->top++;
num /= intoSystem;
}
printf("轉(zhuǎn)換后:");
while (!isNull(s)) {int data = pop(s);
if (data>=10) { printf("%c", data+55);
}else { printf("%d", data);
}
}
printf("\n");
}
void main(){while (1) {int num, intoSystem;
printf("請輸入一個大于零的十進制整數(shù)(0結(jié)束):");
scanf_s("%d", &num);
if (num == 0) { printf("--->>>輸入結(jié)束\n");
break;
}
printf("請輸入要轉(zhuǎn)換的進制(2,8,10,16):");
scanf_s("%d", &intoSystem);
hexadecimalConversion(s, num, intoSystem);
}
}
void palindromeJudgment(struct Stack *s) { while (1) {if (isFull(s)) { printf("--->>>棧滿,不允許繼續(xù)插入\n");
}
int data;
printf("判斷回文--請輸入進棧數(shù)據(jù)(0結(jié)束):");
scanf_s("%d", &data);
if (data == 0) { printf("--->>>輸入結(jié)束\n");
break;
}
push(s, data);
}
int palindromeArray[maxLength];
int count = 0;
while (!isNull(s)) {int data = pop(s);
palindromeArray[count] = data;
count++;
}
int flag = 0;
for (int i = 0; i< count;i++) {if (s->data[i] == palindromeArray[i]) { flag++;
}
}
if (flag == count) {printf("是回文\n");
}
else {printf("不是回文\n");
}
}
補充:鏈棧入棧:創(chuàng)建新節(jié)點P , 將P的next屬性指向棧頂后,再改變棧頂?shù)闹?br />
出棧:保存棧頂?shù)闹岛?,先改變棧頂?shù)奈恢茫籴尫疟4娴闹怠?br />
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧