user-0 提问: 一个栈的问题

回复:
user: user-1
content: for reference only package main import (     "fmt"     "errors"     "strconv" ) type stack struct{      data []int  } func (s *stack)push(n int) {     s.data = append(s.data , n) }  func (s *stack)pop() (int , error){     a := *s     lenStack := len(s.data)     if lenStack < 1{         return 0, errors.New("error , can not pop a empty stask")     }     tmp := a.data[lenStack-1]     s.data =  a.data[0 : (lenStack-1)]     return tmp , nil }  func (s *stack)find(n int) int{     for i, v := range s.data{         if v == n{             return i         }     }     return -1 }  func (s *stack)string()string{     str := ""     if len(s.data) == 0{         return "栈空"     }     for _, v := range s.data{         str += strconv.Itoa(v) + " "     }    return str } func main(){     var data int     s := &stack{}      for{           fmt.Scanf("%d\n",&data)           pos := s.find(data)           if pos != -1{               for {                   popValue , _ := s.pop()                   if popValue == data {                       break;                   }               }               fmt.Println("当前栈:" + s.string())               continue           }           s.push(data)           fmt.Println("当前栈:" + s.string())     } }

user: user-2
content: 楼主既然不要求以什么方式实现，那我就用数组当做栈，不知道满不满足要求。 #include <stdlib.h> #include <stdio.h>  #define MAX 100  int isEmpty(int stack[]) { 	if(0 == stack[0]) 		return 0; 	return 1; } //入栈 void push(int stack[], int top, int num) { 	int i = 0; 	printf("栈中内容为:"); 	stack[top] = num; 	for(i = 0; i <= top; i ++) 	{ 		printf("%d ", stack[i]); 	} 	printf("\n"); } //出栈 int pop(int stack[], int top) { 	int tmp = stack[top]; 	stack[top] = 0; 	return tmp; }  int main(int argc, char *argv[]) { 	int stack[100] = {0};//栈 	int top = -1;//当前栈头位置 	int num = 0;//输入的元素值 	int i = 0; 	int j = 0; 	int k = 0; 	for(i = 0; i < 60; i ++) 	{ 		printf("输入元素值:"); 		scanf("%d", &num); 		for(j = top; j >= 0; j --)//扫描是否有以入栈的元素与之前元素相同 		{ 			if(stack[j] == num) 			{ 				break; 			} 		} 		if(0 < j || (j == 0 && stack[0] == num && top >= 0))//如果当前栈中有与输入元素相同的值，出栈 		{ 			printf("弹出内容为:"); 			for(k = top; k >= j; k --) 			{ 				printf("%d ", pop(stack, top)); 				top --; 			} 			printf("\n"); 		} 		else//否则入栈 		{ 			top ++; 			push(stack, top, num); 		} 	} }

user: user-3
content: 二叉树，做这个比较好

user: user-0
content: 弄得是一个单纯的.c文件。虽然感谢4楼的大哥打了一堆码，但是连表头我都不认识........

user: user-0
content: 这东西我怎么回复单独的人呀........其实我想说的不是局限于只是用栈来实现，是有这么一个命题，用什么实现都行

user: user-4
content: 二叉堆结合链式栈。

user: user-5
content: #include "stdafx.h" #include<iostream>   #include<stack>   using namespace std; void show_stack(stack<int> stl_stack) { 	cout << "current stack value:"; 	while (!stl_stack.empty()) { 		cout << stl_stack.top() << " "; 		stl_stack.pop(); 	} 	cout << endl; }  bool find_value_in_stack(int value ,stack<int> stl_stack, stack<int> &stl_stack_dest) { 	bool bfind = false; 	while (!stl_stack.empty()) { 		if(value == stl_stack.top()) 		{ 			stl_stack.pop(); 			bfind = true; 			break; 		} 		stl_stack.pop(); 	} 	if(bfind == true) 	{ 		stl_stack_dest = stl_stack; 	} 	return bfind; }  int main() { 	int ivalue; 	stack<int>stl_stack; 	while (true) 	{ 		cout << "input: "; 		if(stl_stack.empty()) 		{ 			cin >> ivalue; 			stl_stack.push(ivalue); 			show_stack(stl_stack); 			continue; 		} 		cin >> ivalue; 		stack<int>t_stl_stack; 		if(find_value_in_stack(ivalue, stl_stack, t_stl_stack) == true) 		{ 			stl_stack = t_stl_stack; 		} 		else 		{ 			stl_stack.push(ivalue); 		} 		show_stack(stl_stack); 	} }  栈的C实现 首先你可以自己实现  如果栈很大 建议转换成循环队列 这样直接以最底下的元素向上查找 效率会高些 且C实现采取链式存储。

user: user-6
content: 你可以设置一个标记数组bool[]表示该数是否已经入栈，数组下标就是该数，所以数组可能会比较大。如果很大，确实，参考楼上的解答，换一种方法，不一定非得是栈。

user: user-7
content: 和之前栈内所有元素比较的话，建议不要用栈了。要使用方便查找和删除的数据结构。