0x00数据结构——C语言实现(栈+后缀表达式计算)

0x00数据结构——C语言实现(栈)

栈的实现

/*
 栈(tack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶(top)。
 对栈的基本操作有Push(进栈)和Pop(出栈)。
 
 Functions:
 (在链表中增加附加头结点的版本)
	创建一个空栈
	将栈置为空
	计算栈长度
	返回栈的地址
	栈push操作函数
	栈pop函数
	取栈顶元素Top函数
	判断栈空,空返回真,否则返回假
	输出
	
*/

#ifndef STACK_H
#define STACK_H


#define MAXLEN 100
typedef enum {
	false = 0,
	true
} BOOL;

//数据结构。
struct node;
typedef struct node node;
typedef struct node *to_node;
typedef to_node pos;

struct stack_node;
typedef struct stack_node stack_node;
typedef stack_node *stack;


//创建一个空栈
stack create_stack(void);

//将栈置为空
BOOL set_empty(stack s);

//计算栈长度
int calc_length(stack s);


//栈push操作函数
int push(stack s, int x);

//栈pop函数
int pop(stack s);

//取栈顶元素Top函数
int get_val(stack s);

//判断栈空,空返回真,否则返回假
BOOL is_empty(stack s);

//输出
void output(stack s);

#endif
#include "stack.h"
#include <stdio.h>
#include <stdlib.h>


/*
struct node;
typedef struct node node;
typedef struct node *to_node;
typedef to_node pos;

struct stack_node;
typedef struct stack_node stack_node;
typedef stack_node *stack;
*/
struct node {
	int val;
	struct node *next;
};
struct stack_node {
	int capacity;
	struct node *top;
};
/*
	用链表来实现栈,这里设计一个额外的栈头节点,该节点指向栈顶(便于进栈和出栈)
*/
//创建一个空栈
stack create_stack(void)
{
	stack tmp = (stack)malloc(sizeof(stack_node));
	if(tmp != NULL) {
		tmp->top = NULL;
		tmp->capacity = 0;
	}
	return tmp;
}

//将栈置为空
BOOL set_empty(stack s)
{
	pos tmp;
	while(s->capacity != 0) {
		tmp = s->top;
		s->top = tmp->next;
		free(tmp);
		(s->capacity)--;
	}
	return true;
}

//计算栈长度
int calc_length(stack s)
{
	return s->capacity;
}


//栈push操作函数
int push(stack s, int x)
{
	node *tmp = (node *)malloc(sizeof(node));
	tmp->val = x;
	tmp->next = s->top;
	s->top = tmp;
	(s->capacity)++;
	return x;
}

//栈pop函数
int pop(stack s)
{
	node *tmp;
	int r = 0;
	tmp = s->top;
	s->top = tmp->next;
	(s->capacity)--;
	r = tmp->val;
	free(tmp);
	return r;
}

//取栈顶元素Top函数
int get_val(stack s)
{
	return s->top->val;
}

//判断栈空,空返回真,否则返回假
BOOL is_empty(stack s)
{
	return (s->capacity == 0);
}

//输出
void output(stack s)
{
	pos tmp = s->top;
	while(tmp != NULL) {
		printf("%d->", tmp->val);
		tmp = tmp->next;
	}
	printf("|\n");
}

利用栈进行后缀表达式的计算

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "stack.h"


int main()
{
//	后缀表达式的计算

	stack s;
	int i = 0, len = 0;
	int tmp1, tmp2;
	int op;
//	char in[100] = {0};
	char in[] = {'6','5','2','3','+','8','*','+','3','+','*'};
	s = create_stack();
//	while((in[i] = getchar())!=EOF) {
//		i++;
//	}
	
	len = strlen(in);

	for(i = 0; i<len; i++) {
		tmp1 = in[i];
		if(tmp1=='+' || tmp1=='-' || tmp1 == '*' || tmp1 == '/') {
			op = tmp1;
			tmp1 = pop(s);
			tmp2 = pop(s);
			switch(op) {
				case '+': push(s, tmp1+tmp2);break;
				case '-': push(s, tmp1-tmp2);break;
				case '*': push(s, tmp1*tmp2);break;
				case '/': push(s, tmp1/tmp2);break;
				default: break;
			}
		} else if(isdigit(tmp1)) {
			push(s,tmp1-48);
		}
		output(s);
	}
	
	output(s);
	return 0;
}

实验结果

6->|
5->6->|
2->5->6->|
3->2->5->6->|
5->5->6->|
8->5->5->6->|
40->5->6->|
45->6->|
3->45->6->|
48->6->|
288->|
288->|
Time elapsed: 000:00:047
Press any key to continue
posted @ 2018-04-25 14:09  main_c  阅读(452)  评论(0)    收藏  举报