【数据结构】栈的基本操作与栈的应用

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。【数据结构】栈的基本操作与栈的应用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

  1. 栈(Stack):插入和删除只在一端的线性表就是栈

  2. 结构:
    栈结构

  3. 栈底(base):不能进行插入和删除的一端就是栈底。

  4. 栈顶(top):可以插入删除的那一端就是栈顶。

  5. 栈顶(top):可以插入删除的那一端就是栈顶。

  6. 初始值:base = 0;top = 0;栈底的初始值即位置不会改变,每进栈一条数据,栈顶的位置都会发生改变,当没有数据时栈顶的初始位置为0;

  7. 进栈(插入数据)push:将新值插入到栈顶位置,同时栈顶改变一个位置
    data[top] = A;
    top ++;

  8. 栈满:当栈顶的值等于栈的最大长度时,说明栈满。
    top == maxsize – 1

  9. 出栈(删除)POP:往下改变栈顶的位置即可。
    top –;

  10. 出栈(删除)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));

}

补充:栈的应用

  1. 进制转换
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);
	}
}
  1. 判断回文数
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属性指向栈顶后,再改变栈顶的值
入栈
出栈:保存栈顶的值后,先改变栈顶的位置,再释放保存的值。
出栈

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/204355.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!