赞
踩
栈(Stack):插入和删除只在一端的线性表就是栈
结构:
栈底(base):不能进行插入和删除的一端就是栈底。
栈顶(top):可以插入删除的那一端就是栈顶。
栈顶(top):可以插入删除的那一端就是栈顶。
初始值:base = 0;top = 0;栈底的初始值即位置不会改变,每进栈一条数据,栈顶的位置都会发生改变,当没有数据时栈顶的初始位置为0;
进栈(插入数据)push:将新值插入到栈顶位置,同时栈顶改变一个位置
data[top] = A;
top ++;
栈满:当栈顶的值等于栈的最大长度时,说明栈满。
top == maxsize - 1
出栈(删除)POP:往下改变栈顶的位置即可。
top --;
出栈(删除)POP:往下改变栈顶的位置即可。
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函数测试
//程序入口 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("--->>>栈满,不允许继续插入\n"); } int data; printf("请输入进栈数据(0结束):"); scanf_s("%d",&data); if (data == 0) { printf("--->>>输入结束\n"); break; } push(s,data); } //出栈 printf("出栈了一个数据:%d\n",pop(s)); }
int hexadecimalConversion(struct Stack * s,int num,int intoSystem) { while (num>0) { s->data[s->top] = num % intoSystem; s->top++; num /= intoSystem; } printf("转换后:"); 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("请输入一个大于零的十进制整数(0结束):"); scanf_s("%d", &num); if (num == 0) { printf("--->>>输入结束\n"); break; } printf("请输入要转换的进制(2,8,10,16):"); scanf_s("%d", &intoSystem); hexadecimalConversion(s, num, intoSystem); } }
void palindromeJudgment(struct Stack *s) { while (1) { if (isFull(s)) { printf("--->>>栈满,不允许继续插入\n"); } int data; printf("判断回文--请输入进栈数据(0结束):"); scanf_s("%d", &data); if (data == 0) { printf("--->>>输入结束\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"); } }
入栈:创建新节点P , 将P的next属性指向栈顶后,再改变栈顶的值
出栈:保存栈顶的值后,先改变栈顶的位置,再释放保存的值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。